2009-04-15 12 views
9

Ich versuche, ein Bild wie folgt zu skalieren. Ich gebe das geänderte Bild zurück in byte[], damit ich es in der Datenbank speichern kann. Die Transparenz des PNG-Bildes ist verloren. Bitte helfen Sie, das besser zu machen.Warum verliert die Größenänderung eines PNG-Bildes die Transparenz?

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

Antwort

7

Versuchen Sie, den .MakeTransparent() Aufruf auf Ihrem Bitmap-Objekt zu verwenden.

+0

Ja. Selbst das hat nicht funktioniert. –

+0

Ja !!! Es klappt! Du rettest mich! Es ist wichtig, .MakeTransparent() bei jedem Schritt der Bildgrößenanpassung oder Zuschneiden zu verwenden. Nachdem Sie ein neues Image erstellt haben(). Danke! –

+0

Welches Objekt hat diesen MakeTransparent-Aufruf? –

23

Ihr Code nicht recht tun, was Sie denken, dass es funktioniert ...

Sie verwenden die GetThumbnailImage die Größe des Bildes, dann ziehen Sie das Miniaturbild in sich, welche ziemlich sinnlos ist. Sie verlieren wahrscheinlich die Transparenz im ersten Schritt.

Erstellen Sie stattdessen eine leere Bitmap, und ändern Sie die Größe des Quellbilds, indem Sie es auf die leere Bitmap zeichnen.

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

(Ich entfernte einige Parameter, die nie für alles verwendet wurden, die nichts mit dem Ergebnis, wie der imageLen Parameter zu tun hatten, die nur einen Byte-Array erstellen verwendet wurde, die nie verwendet wurde.)

+0

Diese Lösung gibt mir auch kein transparentes Bild. –

+0

Ich habe es sowohl mit PNG-8- als auch mit PNG-24-Bildern ausprobiert und es bewahrt die Transparenz. Können Sie das Bild hochladen, für das Sie die Größe ändern möchten? – Guffa

+0

Nun, wenn ich auf test.png schaue, behält es die Transparenz. Aber wenn ich das Byte [] in der Datenbank ablege und wieder darauf zugreife, versuche das Bild auf meiner Webseite zu laden, dann wird der Hintergrund grau dargestellt. Aber das war nicht der Fall, als ich das Bild direkt in die Datenbank geladen habe, ohne es erneut zu laden. –

2

Mai werden Sie so etwas tun sollte, weil diese Sache für mich gearbeitet:

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