2009-04-15 13 views
9

Próbuję zmienić rozmiar obrazu w następujący sposób. Zwracam obraz o zmienionym rozmiarze do byte[], aby móc go przechowywać w bazie danych. Zniknie przezroczystość obrazu png. Pomóżcie, aby było lepiej.Dlaczego zmiana rozmiaru obrazu png traci przezroczystość?

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

Odpowiedz

7

Spróbuj użyć wywołania .MakeTransparent() na obiekcie bitmapowym.

+0

Tak. Nawet to nie działało. –

+0

Tak! To działa! Ratujesz mnie! Ważne jest, aby użyć .MakeTransparent() na każdym kroku zmiany rozmiaru obrazu lub przycinania. Po utworzeniu nowego obrazu(). Dziękuję Ci! –

+0

Jaki obiekt ma wywołanie MakeTransparent? –

23

Twój kod nie robi zupełnie co myślisz, że robi ...

użyć GetThumbnailImage aby zmienić rozmiar obrazu, a następnie narysować obraz miniatury w siebie, która jest raczej bezcelowe. Prawdopodobnie tracisz przezroczystość w pierwszym kroku.

Zamiast tego utwórz pustą bitmapę i zmień rozmiar obrazu źródłowego, rysując go na pustej bitmapie.

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

(usunąłem kilka parametrów, które nigdy nie zostały wykorzystane do niczego, że miał do czynienia z takim skutkiem, jak parametr imageLen który został użyty jedynie w celu utworzenia tablicy bajtów, że nigdy nie był używany.)

+0

To rozwiązanie również nie daje mi przezroczystego obrazu. –

+0

Próbowałem go z obrazami PNG-8 i PNG-24, i zachowuje przezroczystość. Czy możesz opublikować obraz, który próbujesz zmienić? – Guffa

+0

Jeśli spojrzę na test.png, zachowam przezroczystość. Ale jeśli przechowuję bajt [] w bazie danych i uzyskuję do niego dostęp, próba załadowania tego obrazu na moją stronę internetową, wówczas tło jest wyświetlane jako szare. Ale tak się nie stało, gdy ładowałem obraz bezpośrednio do bazy danych bez ponownego wpisywania. –

2

może trzeba zrobić coś takiego, bo to rzecz pracował dla mnie:

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); 
} 
Powiązane problemy