4

ブラウザから MS SQL データベースに画像ブロブとしてファイルをアップロードする単純な MVC2 アプリがあります。

次に、次のような結果を返すことができます。

        public FileContentResult ShowPhoto(int id)
        {
           TemporaryImageUpload tempImageUpload = new TemporaryImageUpload();
           tempImageUpload = _service.GetImageData(id) ?? null;
           if (tempImageUpload != null)
           {
              byte[] byteArray = tempImageUpload.TempImageData;
              return new FileContentResult (temp, "image/jpeg");
           }
           return null;
        }

しかし、これらの画像をサムネイルとギャラリーサイズのビューの両方でサイズ変更して返したいと思います。この結果内でこれを行うことは可能ですか? 私は素晴らしいimageresizer.netで遊んでいますが、避けたいサーバーに画像を保存したいようです。その場でこれを行うことは可能ですか..?

元のファイルを保持する必要があり、可能であれば、画像をファイルとしてサーバーに保存したくありません。

ご指摘ありがとうございます。

4

3 に答える 3

11

ImageResizer.NET では、サイズ変更のためにストリームを渡すことができます。マネージ API の使用を参照してください。

使用する方法は次のとおりです。

ImageResizer.ImageBuilder.Current.Build(オブジェクトのソース、オブジェクトの宛先、ResizeSettings の設定)

私はあなたの方法をこのように変更しましたが、テストされていません。それが役に立てば幸い。

public FileContentResult ShowPhoto(int id)
    {
       TemporaryImageUpload tempImageUpload = new TemporaryImageUpload();
       tempImageUpload = _service.GetImageData(id) ?? null;
       if (tempImageUpload != null)
       {
          byte[] byteArray = tempImageUpload.TempImageData;
          using(var outStream = new MemoryStream()){
              using(var inStream = new MemoryStream(byteArray)){
                  var settings = new ResizeSettings("maxwidth=200&maxheight=200");
                  ImageResizer.ImageBuilder.Current.Build(inStream, outStream, settings);
                  var outBytes = outStream.ToArray();
                  return new FileContentResult (outBytes, "image/jpeg");
              }
          }
       }
       return null;
    }
于 2012-05-07T15:43:55.230 に答える
4

画像のサイズ変更に関する最近の Hanselminutes ポッドキャストで、Nathanel Jones が画像のサイズ変更の落とし穴について話し合っていました。

ポッドキャスト全体を聞くのに 30 分もかからない場合でも、ショー ノートでは、いくつかの興味深いサイズ変更の落とし穴や、同じくNathanel Jones によって作成された画像サイズ変更ライブラリが指摘されています。

于 2012-05-07T15:55:35.673 に答える
3

その場で画像のサイズを変更できます:

public void ResizeImage(Stream input, Stream output, int newWidth, int maxHeight)
{
    using (var srcImage = Image.FromStream(input))
    {
        int newHeight = srcImage.Height * newWidth / srcImage.Width;
        if (newHeight > maxHeight)
        {
            newWidth = srcImage.Width * maxHeight / srcImage.Height;
            newHeight = maxHeight;
        }

        using (var newImage = new Bitmap(newWidth, newHeight))
        using (var gr = Graphics.FromImage(newImage))
        {
            gr.SmoothingMode = SmoothingMode.AntiAlias;
            gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
            gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
            newImage.Save(output, ImageFormat.Jpeg);
        }
    }
}

次に、2 つのコントローラー アクション (フル イメージ サイズを表示するアクションとサムネイルを表示するアクション) を使用できます。

public ActionResult Thumbnail(int id)
{
    var tempImageUpload = new TemporaryImageUpload();
    tempImageUpload = _service.GetImageData(id) ?? null;
    if (tempImageUpload == null)
    {
        return HttpNotFound();
    }

    using (var input = new MemoryStream(tempImageUpload.TempImageData))
    using (var output = new MemoryStream())
    {
        ResizeImage(input, output, 640, 1000);
        return File(output.ToArray(), "image/jpeg");
    }
}
于 2012-05-07T15:32:11.073 に答える