2009-04-15 13 views
9

イメージのサイズを次のように変更しようとしています。私はbyte[]にサイズ変更されたイメージを返すので、データベースに保存することができます。 png画像の透明度が失われます。これをより良くするためにお手伝いください。PNGイメージのサイズ変更で透明性が失われるのはなぜですか?

private byte[] GetThumbNail(string imageFile, Stream imageStream, 
    int imageLen) 
{ 
    try 
    { 
    Image.GetThumbnailImageAbort imageCallBack = 
     new Image.GetThumbnailImageAbort(ThumbnailCallback); 
    Bitmap getBitmap = new Bitmap(imageFile); 
    byte[] returnByte = new byte[imageLen]; 
    Image getThumbnail = getBitmap.GetThumbnailImage(160, 59, 
     imageCallBack, IntPtr.Zero); 
    using (Graphics g = Graphics.FromImage(getThumbnail)) 
    { 
     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
     g.InterpolationMode = 
     System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     g.DrawImage(getThumbnail, 0, 0, 160, 59); 
    } 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     getThumbnail.Save(ms, ImageFormat.Png); 
     getThumbnail.Save("test.png", ImageFormat.Png); 
     returnByte = ms.ToArray(); 
    } 
    return returnByte; 
    } 
    catch (Exception) 
    { 
    throw; 
    } 
} 

答えて

7

ビットマップオブジェクトで.MakeTransparent()呼び出しを使用してみてください。

+0

はい。それでも仕事はできませんでした。 –

+0

はい!できます!あなたは私を助けてくれる!イメージのサイズ変更やトリミングの各ステップで.MakeTransparent()を使用することが重要です。新しいImage()を作成した後。ありがとうございました! –

+0

このMakeTransparentはどのオブジェクトを呼び出しますか? –

23

あなたのコードは、あなたがそれが...

あなたは、あなたはかなり無意味である自体にサムネイル画像を描画し、画像のサイズを変更するGetThumbnailImageを使用しないと思いますかなり何をしません。おそらく最初のステップで透明性が失われます。

代わりに空のビットマップを作成し、空のビットマップに描画してソースイメージのサイズを変更します。

private byte[] GetThumbNail(string imageFile) { 
    try { 
    byte[] result; 
    using (Image thumbnail = new Bitmap(160, 59)) { 
     using (Bitmap source = new Bitmap(imageFile)) { 
     using (Graphics g = Graphics.FromImage(thumbnail)) { 
      g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      g.DrawImage(source, 0, 0, 160, 59); 
     } 
     } 
     using (MemoryStream ms = new MemoryStream()) { 
     thumbnail.Save(ms, ImageFormat.Png); 
     thumbnail.Save("test.png", ImageFormat.Png); 
     result = ms.ToArray(); 
     } 
    } 
    return result; 
    } catch (Exception) { 
    throw; 
    } 
} 

(私は使用されませんでしたバイト配列を作成するために使用されたimageLenパラメータと同様に、結果とは何かを持っていた何のために使用されなかったいくつかのパラメータを削除。)

+0

この解決方法も私に透明なイメージを与えません。 –

+0

PNG-8とPNG-24の両方の画像で試してみましたが、透明度は保持されています。サイズを変更しようとしている画像を投稿できますか? – Guffa

+0

もし私がtest.pngを見ると、それは透明性を保持しています。しかし、私がデータベースにバイト[]を保存してそれに再度アクセスすると、そのイメージをWebページにロードしようとすると、背景がグレー表示されます。しかし、これは、イメージを再サイズせずに直接データベースにロードしている場合には当てはまりませんでした。 –

2

この事は、私のために働いていたので、あなたがこのような何かを行う必要がありますことがあります

String path = context.Server.MapPath("/images"); 
if (!path.EndsWith("\\")) 
    path += "\\"; 
path += "none.png"; 

Image img = CreateThumbnail(Image.FromFile(path)); 

MemoryStream ms = new MemoryStream(); 
img.Save(ms, ImageFormat.Png); 
ms.WriteTo(context.Response.OutputStream); 

private System.Drawing.Image CreateThumbnail(System.Drawing.Image i) 
{ 
    int dWidth = i.Width; 
    int dHeight = i.Height; 
    int dMaxSize = 150; 

    if (dWidth > dMaxSize) 
    { 
     dHeight = (dHeight * dMaxSize)/dWidth; 
     dWidth = dMaxSize; 
    } 
    if (dHeight > dMaxSize) 
    { 
     dWidth = (dWidth * dMaxSize)/dHeight; 
     dHeight = dMaxSize; 
    } 
    return i.GetThumbnailImage(dWidth, dHeight, delegate() { return false; }, IntPtr.Zero); 
} 
関連する問題