2

ASP.NETMVC3と4つのWebサイトがいくつかあります。すべてのサイトは、ライブラリとは別の同じリソースを使用しています。リソースは.resxファイルです。これらのサイト内のHTMLで、これらのリソースの画像を使用したいと思います。以前はresxファイルを使用していなかったので、それらを操作するための良い方法がわかりません。適切なリソースファイルから適切な画像を提供するサービスを作成するかもしれないと思いますが、もっと良い方法があるはずです。私の質問は、resxファイルからこれらの画像を使用するための良い方法は何ですか?resxに画像を保存するのは本当に良くないかもしれませんか?

4

1 に答える 1

5

これを行う簡単な方法の1つは、コントローラーにアクションを追加することです。これFileStreamResultにより、リソースキーに基づいてイメージが返されます。

public FileStreamResult Image(string key)
{
    var bitmap = (Bitmap)Resources.Images.ResourceManager.GetObject(key);
    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Png);
    stream.Seek(0, SeekOrigin.Begin);
    return new FileStreamResult(stream, "image/png");
}

これで、次のようにビューからアクセスできるようになります。

<img src='@Url.Action("Image", "MyController", new { key = "Image1" })' />

別の方法(ビューのみを使用して実行できます)は、base64でエンコードされた文字列を作成することです。

@{
    var stream = new MemoryStream();
    var bitmap = Resources.Images.ResourceManager.GetObject("Image1") as System.Drawing.Bitmap;
    bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
    stream.Seek(0, SeekOrigin.Begin);
    string base64 = Convert.ToBase64String(stream.ToArray());
}

<img src="data:image/gif;base64,@base64" />

これを実装する良い方法は、Razorヘルパーを使用して、ビューでより単純な構文を有効にすること@Html.GetImageFor(Resources.Images.Image1, "alt")です。

public static MvcHtmlString GetImageFor(this HtmlHelper helper, Bitmap bitmap, string AltText = "")
{
    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
    stream.Seek(0, SeekOrigin.Begin);
    string base64 = Convert.ToBase64String(stream.ToArray());

    return new MvcHtmlString(
        string.Format("<img src='data:image/gif;base64,{0}' alt='{1}' />",
            base64, AltText)
    );
}

注: .ResXファイルのプロパティは、次のように設定する必要があります(MVCプロジェクトの場合と同様)。

  • PublicResXFileCodeGeneratorCustomToolに設定
  • リソースCustom Tool Namespaceに設定
于 2012-09-21T02:40:41.293 に答える