2012-05-07 17 views
4

ブラウザからMS SQLデータベースにImage blobとしてファイルをアップロードする単純なMVC2アプリケーションがあります。Image 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で遊んできましたが、私が避けたいと思うサーバーに画像を保存したいと思うようです。これを行うことは可能ですか?

元のファイルを保存し、可能であれば、イメージをファイルとしてサーバーに保存する必要があります。

ありがとうございました!

+0

うわー!どちらの答えも素晴らしいです。私はこれらの応答のうちの1つで月を越えていたと答えたときに今何をするべきかわかりません:) – beebul

答えて

11

ImageResizer.NETは、あなたが使用したいManaged API usage

方法がある見、あなたがリサイズのためにそれにストリームを渡すことができます

ImageResizer.ImageBuilder.Current.Build(オブジェクトソース、オブジェクトDEST、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; 
    } 
+0

私はこれを答えとして選択します。私は既にImageResizerを使っていました。ありがとう! – beebul

+0

実際、 'inStream'は必須ではありません.ImageResizerはbyte []配列を直接消費できます。また、特定の要求に対してディスクキャッシュを必要としない場合は、効率の悪いMVC結果を生成する代わりに&cache = noを追加することができます。 –

+0

@ComputerLinguist、このメソッドはDiskCachingを使用していません。上に変換されたバイト配列を示していますが、ディスクキャッシュを使用している例がありますか? – vernak2539

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); 
     } 
    } 
} 

をし、その後、あなたは(サムネイルを表示するフル画像サイズを表示1つずつ)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"); 
    } 
} 
+0

ありがとうダーリン、これは便利でした:) David – beebul

4

画像のサイズ変更の落とし穴のいくつかを議論ナタナエル・ジョーンズとImage Resizingに関する最近のHanselminutesポッドキャストがありました。

完全なポッドキャストを聴くのに30分もかからない場合でも、ショーノートでは、面白いresizing pitfallsとNathanael Jonesによって書かれた画像のサイズ変更libraryがあります。

+0

ありがとうジャック私は間違いなくそれをチェックします。 – beebul

関連する問題