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)
相手側からブロックされていないかどうかをまず切り分けてください。
つまり、目的の画像ではなく、自分のサーバーの画像がダウンロードできるかどうか、また同期メソッドならダウンロードできるかどうかの二点について調べてください。
Fillderで確認しました、Status Codeは200でした。
他の画像だとどうなりますか?
また、stream からビットマップを作成するのではなく、読み取ったバイトコードをそのまま拡張子 jpg のファイルに保存した場合はどうなりますか?
stream が返ってきた時点で非同期処理は終わっているので、あとはデータの問題点と思います。自動ダウンロード対策で 0 バイトのデータを返すような処理がされている可能性も考慮してください。
他の画像で試しても、ダメでした。
byte配列をファイルに保存したら、表示できました。
保存できたということは、データの取得まではできているということですね。
> Bitmap bitmap = new Bitmap(stream);//ここで止まってしまう
この部分で止まるのはどうやって確認していますか?
>質問者さん
> byte配列をファイルに保存したら、表示できました。
と言うことは、新たにいただいたSurferOnWwwさんの回答と合わせて考えると、"Content-Type: image/webp"のストリームを直接Bitmapクラスのコンストラクタに食わせると問題がある、と言うことなので、いったんファイルへ保存してからBitmapで読み出せばよいというではないでしょうか。
表示できたというのは、他のアプリで表示できたということじゃないでしょうか。
エンコーダーが無いなら、保存しても読み込みはできないはずです。
(そもそもファイルを読み込む場合には Stream に変換してから読み込むので同じです)
>Zuishinさん
あ、なるほど。エンコーダを独自で持つ他のアプリを使っているのであればその通りですね。Bitmapのコンストラクタについて、Streamに変換してから読み込むことについても承知しました。訂正ありがとうございます。
回答2件
あなたの回答
tips
プレビュー