質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1013閲覧

デッドロック?してしまう Bitmap Class

Nanimono

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/06/06 01:56

編集2020/06/06 02:05

Bitmapクラスを初期化しようとすると例外も出ず、スレッドが永遠にブロックされ困っています。
なぜスレッドがブロックされるのでしょうか?
回答お願いします。

C#

1 /// <summary> 2 /// キャッシュ又はサーバーから写真を入手します 3 /// </summary> 4 /// <param name="url">写真のURL</param> 5 /// <returns></returns> 6 private async Task<Bitmap> GetImage(string url) 7 { 8 HttpRequestMessage httpRequestMessage = new HttpRequestMessage(); 9 httpRequestMessage.RequestUri = new Uri(url); 10 httpRequestMessage.Headers.Add("Accept", "image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5"); 11 httpRequestMessage.Headers.Add("Accept-Language", "ja,en-US;q=0.7,en;q=0.3"); 12 httpRequestMessage.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); 13 httpRequestMessage.Headers.Add("Connection", "close"); 14 15 if (imageETag != string.Empty && imageETag != null) 16 { 17 httpRequestMessage.Headers.Add("If-None-Match", imageETag); 18 } 19 var res = await httpClient.SendAsync(httpRequestMessage); 20 21 imageETag = res.Headers.GetValues("ETag").FirstOrDefault(); 22 if(res.StatusCode == HttpStatusCode.NotModified) 23 { 24 return new Bitmap($"{imageCachePath}{Path.DirectorySeparatorChar}{imageETag}"); 25 } 26 else 27 { 28 Stream stream = await res.Content.ReadAsStreamAsync(); 29 Bitmap bitmap = new Bitmap(stream);//ここで止まってしまう 例外はでません。 30 bitmap.Save($"{imageCachePath}{Path.DirectorySeparatorChar}{imageETag}"); 31 return bitmap; 32 } 33 } 34```![イメージ説明](f9e359ecac59e993204592dd07ec98f0.png)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/06/06 02:04 編集

相手側からブロックされていないかどうかをまず切り分けてください。 つまり、目的の画像ではなく、自分のサーバーの画像がダウンロードできるかどうか、また同期メソッドならダウンロードできるかどうかの二点について調べてください。
Nanimono

2020/06/06 02:05

Fillderで確認しました、Status Codeは200でした。
Zuishin

2020/06/06 02:14 編集

他の画像だとどうなりますか? また、stream からビットマップを作成するのではなく、読み取ったバイトコードをそのまま拡張子 jpg のファイルに保存した場合はどうなりますか? stream が返ってきた時点で非同期処理は終わっているので、あとはデータの問題点と思います。自動ダウンロード対策で 0 バイトのデータを返すような処理がされている可能性も考慮してください。
Nanimono

2020/06/06 02:24

他の画像で試しても、ダメでした。 byte配列をファイルに保存したら、表示できました。
Zuishin

2020/06/06 02:41

保存できたということは、データの取得まではできているということですね。 > Bitmap bitmap = new Bitmap(stream);//ここで止まってしまう この部分で止まるのはどうやって確認していますか?
dodox86

2020/06/06 05:47

>質問者さん > byte配列をファイルに保存したら、表示できました。 と言うことは、新たにいただいたSurferOnWwwさんの回答と合わせて考えると、"Content-Type: image/webp"のストリームを直接Bitmapクラスのコンストラクタに食わせると問題がある、と言うことなので、いったんファイルへ保存してからBitmapで読み出せばよいというではないでしょうか。
Zuishin

2020/06/06 10:12

表示できたというのは、他のアプリで表示できたということじゃないでしょうか。 エンコーダーが無いなら、保存しても読み込みはできないはずです。 (そもそもファイルを読み込む場合には Stream に変換してから読み込むので同じです)
dodox86

2020/06/06 10:56

>Zuishinさん あ、なるほど。エンコーダを独自で持つ他のアプリを使っているのであればその通りですね。Bitmapのコンストラクタについて、Streamに変換してから読み込むことについても承知しました。訂正ありがとうございます。
guest

回答2

0

ベストアンサー

Content-Type: image/webp

Bitmap bitmap = new Bitmap(stream);//ここで止まってしまう

webp だからじゃないのですか?

ググって調べただけでハズレかもしれませんが、webp から Bitmap への変換にはサードパーティ製のライブラリが必要なようなことが書かれた記事が見つかります。

Convert Bitmap to WebP Image?
https://stackoverflow.com/questions/13220436/convert-bitmap-to-webp-image

WebP for .NET
https://archive.codeplex.com/?p=webp

投稿2020/06/06 04:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nanimono

2020/06/06 10:26

回答ありがとうございます。 HTTPヘッダーを見る限りwebpの様ですが、写真のURLを見るとjpegのようです。 fit=bounds&format=jpeg&quality=45&width=360 ブラウザで確認したのですが実際にはjpegでエンコーディングされていました。
退会済みユーザー

退会済みユーザー

2020/06/06 10:50 編集

> 写真のURLを見るとjpegのようです。 「写真のURL」って何ですか? どうやって見たのですか? > ブラウザで確認したのですが実際にはjpegでエンコーディングされていました。 どのようにしてブラウザで jpeg であることが確認できるのですか? IE で表示されますか?(IE は webp をサポートしてないそうですので、その url をアドレスバーに入れて要求をかけたら表示できないかも)
Nanimono

2020/06/06 10:54

名前を付けて保存を選択するとjpegでした。 IEでも表示されました。
退会済みユーザー

退会済みユーザー

2020/06/07 01:08

質問者さんの回答へのコメントでも書きましたが、要求ヘッダの Accept に、 (1) image/webp が含まれていると Web サーバー(Amazon S3 ですか?)でそれを見て .webp 画像を返す。結果 new Bitmap(stream) で処理できなくて「ここで止まってしまう 例外はでません」ということになる。 (2) image/webp が含まれていないときは、Web サーバーは .webp ではない new Bitmap(stream) で処理できる別の形式の画像を返す。結果、「webpを削除すると動作しました」ということになった。 ・・・ということだったようですので、 > 名前を付けて保存を選択するとjpegでした。 > IEでも表示されました。 .webp 画像が表示できる Chrome とか Firefox には要求ヘッダの Accept にデフォルトで image/webp が含まれている。 一方、.webp 画像が表示できない IE11 には image/webp は含まれない。 ・・・のでブラウザで同じ URL に要求をかけて見た場合は問題なく見えたということだと思います。
guest

0

Acceptにwebpが含まれていました。
Acceptからwebpを削除すると動作しました。
お騒がせしてすみません

C#

1httpRequestMessage.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");

投稿2020/06/06 10:57

Nanimono

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/06/06 10:58

それは SurferOnWww さんの回答と同じです。
退会済みユーザー

退会済みユーザー

2020/06/07 01:03

> Acceptからwebpを削除すると動作しました。 ということは、質問者さんの作ったアプリの要求ヘッダの Accept に、 (1) image/webp が含まれていると Web サーバー(Amazon S3 ですか?)でそれを見て .webp 画像を返す。結果 new Bitmap(stream) で処理できなくて「ここで止まってしまう 例外はでません」ということになる。 (2) image/webp が含まれていないときは、Web サーバーは .webp ではない new Bitmap(stream) で処理できる別の形式の画像を返す。結果、「webpを削除すると動作しました」ということになった。 ・・・ということだったようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問