2つのパラメーター(サイズ変更の場合はxとy)を使用して画像を返すための最良の方法は何ですか。
例えば
~/api/image12345/200/200
200 x 200 jpg / png /またはgifを返します
System.Drawing.Image
オブジェクトを返すか、手動で定義する必要がありますHTTPReponseMessage.Content
か?
2つのパラメーター(サイズ変更の場合はxとy)を使用して画像を返すための最良の方法は何ですか。
例えば
~/api/image12345/200/200
200 x 200 jpg / png /またはgifを返します
System.Drawing.Image
オブジェクトを返すか、手動で定義する必要がありますHTTPReponseMessage.Content
か?
回答:
System.Drawing.Image
適切なバイトに変換する方法を知っているフォーマッタも追加しない限り、を返さないでください。期待どおりにイメージバイトとしてシリアル化されません。
考えられる解決策の1つHttpResponseMessage
は、コンテンツに画像が保存された状態でを返すことです(以下を参照)。質問で示したURLが必要な場合は、{imageName}、{width}、および{height}パラメーターをマップするルートが必要になることに注意してください。
public HttpResponseMessage Get(string imageName, int width, int height)
{
Image img = GetImage(imageName, width, height);
using(MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(ms.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return result;
}
}
しかし、繰り返しになりますが、これを多くの場所で行っている場合は、フォーマッタールートを使用することが「推奨」される方法である可能性があります。プログラミングのほとんどすべてと同様に、答えはシナリオによって異なります。
GetImage
方法はどこですか?
画像が重いです。ASP.NET WebForms、HttpHandlers、MVC、およびWeb APIはすべて、静的ファイルを提供するという非常にひどい仕事をします。IISは、その点で非常に優れた仕事をします。多くの場合、20〜100倍効率的です。
良好なパフォーマンスを実現したい場合は、遅くともPostAuthorizeRequest中にURLを書き換えて、 IISがファイルを取得して提供できるようにします。はい、これはHttpModuleレベルのイベント処理を意味します。
[免責事項:私は次の記事とオープンソースプロジェクトの著者です]
画像を使って動的なことをしている場合は、回避するための画像処理の落とし穴に関するこの記事を確認し、ImageResizerを確認することを検討してください。優れたディスクキャッシング(IIS静的ファイル処理を使用)を備えており、あらゆる種類のイメージ生成に簡単に接続できます。高度な知識が必要な場合は、AForge、FreeImage、およびWIC用のオプションのバインディングもあります。