86

2 つのパラメーター (サイズ変更用の x と y) を持つ画像を返す最良の方法は何ですか。

例えば

~/api/image12345/200/200

200 x 200 の jpg/png/or gif を返します

オブジェクトを返すSystem.Drawing.Imageか、手動で定義する必要がありますHTTPReponseMessage.Contentか?

4

2 に答える 2

151

System.Drawing.Imageそれを適切なバイトに変換する方法を知っているフォーマッタも追加しない限り、 a を返すべきではありません。

考えられる解決策の 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;
    }
}

しかし、繰り返しますが、これを多くの場所で行っている場合は、フォーマッタ ルートを使用することが「推奨される」方法である可能性があります。プログラミングのほとんどすべてと同様に、答えはシナリオによって異なります。

于 2012-09-17T23:49:24.120 に答える
20

画像が重い。ASP.NET WebForms、HttpHandlers、MVC、および Web API はすべて、静的ファイルを提供するという非常にひどい仕事をします。IIS はこれを非常にうまく処理します。多くの場合、20 ~ 100 倍の効率です。

パフォーマンスを向上させたい場合は、遅くともPostAuthorizeRequest 中に URL 書き換えを実行して、IIS がファイルを取得して提供できるようにします。はい、これは HttpModule レベルのイベント処理を意味します。

[免責事項: 私は次の記事とオープンソース プロジェクトの著者です]

画像で何か動的なことをしている場合は、避けるべき画像処理の落とし穴に関するこの記事を確認し、 ImageResizerを検討することを検討してください。優れたディスク キャッシング (IIS 静的ファイル処理を使用) を備えており、あらゆる種類のイメージ生成に簡単に接続できます。高度な操作が必要な場合は、AForge、FreeImage、および WIC のオプションのバインディングも用意されています。

于 2012-09-24T05:49:50.133 に答える