2012-05-18 19 views
9

Kopiuję obraz. (Mój rzeczywisty kod zmienia rozmiar obrazu, ale to nie ma znaczenia dla mojego pytania.) Mój kod wygląda mniej więcej tak.Używanie Graphics.DrawImage() do rysowania obrazu z przezroczystością/kanałem alfa

Image src = ... 

using (Image dest = new Bitmap(width, height)) 
{ 
    Graphics graph = Graphics.FromImage(dest); 
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graph.DrawImage(src, 0, 0, width, height); 
    dest.Save(filename, saveFormat); 
} 

Wydaje się doskonale chyba src jest ładowany obraz z folii (np GIF) lub kanał alfa (np PNG).

W jaki sposób mogę uzyskać DrawImage() przeniesienie folii przezroczystych/alfa do nowego obrazu, a następnie zachować je po zapisaniu pliku?

+0

Pytanie brzmi, jaka jest wartość zmiennej 'saveFormat'? Powinien to być 'PixelFormat.Format32bppArgb' (lub inny format obsługiwany z kanałem alfa). Spróbuj także: 'using (Image dest = new Bitmap (width, height, PixelFormat.Format32bppArgb))'. –

+0

To wydaje się działać dla kanałów alfa, ale nie dla przezroczy GIF. 'saveFormat' będzie się różnić w zależności od formatu pliku wejściowego. Jeśli plik wejściowy nie obsługuje kanału alfa, można założyć, że obraz nie będzie zawierał pikseli kanału alfa. –

+0

Jaka jest więc wartość 'saveFormat' dla plików GIF, a następnie :)? –

Odpowiedz

22

To jest dość niejasne, wiele nie powiedziałeś. Największy problem z przezroczystością polega na tym, że go nie widać. Pominąłeś kilka kroków, nie określiłeś wprost formatu pikseli twojej nowej bitmapy, w ogóle go nie zainicjalizowałeś i nie powiedziałeś jakiego formatu wyjściowego używasz. Niektóre nie obsługują przejrzystości. Zróbmy więc wersję, która uczyni ją krystalicznie czystą. Z obrazu PNG, który wygląda jak ten w Paint.NET:

enter image description here

Za pomocą tego kodu

 using (var src = new Bitmap("c:/temp/trans.png")) 
     using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
     using (var gr = Graphics.FromImage(bmp)) { 
      gr.Clear(Color.Blue); 
      gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save("c:/temp/result.png", ImageFormat.Png); 
     } 

ten sposób uzyskuje się obraz:

enter image description here

można wyraźnie zobaczyć niebieskie tło, więc przezroczystość działała.

+1

Cóż, moim zamiarem było wspieranie tego, który format pasował do pliku wejściowego. Myślałem, że jestem dość konkretny. Chodzi o to, że kod nie miał obsługiwać tylko jednego typu pliku. Być może potrzebuję pakietu kodu do obsługi każdego typu pliku - nie wiem. Spróbowałem określić PixelFormat tak jak ty, ale wtedy wydawało się, że to powodowało błędy, gdy typem pliku był GIF z przezroczystością. W rzeczywistości niektóre odmiany zdawały się działać dobrze z plikami PNG bez określania PixelFormat. –

+0

@ JonathanWood stwórz nową bitmapę ze starą szerokością i wysokością bitmapy oraz twoim nowym pożądanym formatem. Najlepiej w instrukcji 'using' utwórz obiekt graficzny' FromImage ('twoja nowa bitmapa')' i 'DrawImage (' twoja stara bitmapa') '. –