растровое изображение c#.Сохранить прозрачность не сохраняется в png

Я пытаюсь сохранить класс растрового изображения, который имеет транспарантность в виде файла png с транспарантностью. Мне не везет.

растровое изображение имеет прозрачность, оно просто не сохраняет прозрачность.

это то, что я делаю

настройка растрового изображения

Bitmap ret = new Bitmap(bWidth, bHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

сохранение на носители*

ret.Save(filename, ImageFormat.Png);

Я также попытался сохранить файл с помощью filestream, и это не имело значения.

когда изображение находится в поле изображения, транспарантность существует, но когда я спасаю, я просто получаю черный фон.

Я действительно не хочу использовать какой-либо сторонний код, они нашли способ сделать это, я бы тоже хотел.

спасибо.

10 ответов


вы уверены, что формат пикселя растрового изображения


прошло некоторое время с тех пор, как я сделал редактирование/сохранение изображений, но если я правильно помню, PNGs отличаются от большинства. Я думаю, вы должны использовать фактический FileStream.

EDIT: Ах, нашел пример здесь

FileStream imageStream= new FileStream( filename, FileMode.Create );
myBitmap.Save( imageStream, ImageFormat.Png );
imageStream.Close();

EDIT2: после дополнительных исследований я думаю, что промежуточный шаг требуется только при определенных обстоятельствах.

также возможно, что, поскольку вы используете "MakeTransparent", он ловит индексированную Альфу, но пытается сохранить на основе фактического Альфа-значения каждого пикселя. Вы можете попробовать фактически установить Альфа-значения изображения.


причина в том, что Bitmap класс не работает с прозрачностью.

вам нужно бросить Bitmap to Image.

Bitmap ret = new Bitmap(bWidth, bHeight, 
                        System.Drawing.Imaging.PixelFormat.Format32bppArgb);    

ret.MakeTransparent(Color.White);     // Change a color to be transparent
Image img = (Image) ret;
img.Save(filename, ImageFormat.Png);  // Correct PNG save

ret.MakeTransparent(...);

вы пробовали использовать Bitmap.MakeTransparent() метод?


Я просто хотел напомнить всем, что MakeTransparent, как было предложено моим многим людям здесь,только делает определенный цвет прозрачным. Он не учитывает Альфа-канал изображения argb. Таким образом, пиксель с Альфа-значением 100, например, если он не соответствует цвету, предоставленному MakeTransparent, не будет иметь частичной прозрачности.


сохранение в формате PNG требует поиска потока, такого как FileStream или MemoryStream. Если вы сохраните в одном из них и получите оттуда, будет исключение noe GDI+ или подобное. Надеюсь, это поможет.


Портативное Сети Graphhics(.png) форматы поддерживают прозрачность, поэтому при сохранении изображения установите формат изображения в ImageFormat.формат PNG.

        //update image to database
        MemoryStream msImage = new MemoryStream();
        imgPhoto.Save(msImage, System.Drawing.Imaging.ImageFormat.Png);
        byte[] Img = (byte[])msImage.ToArray();

поэтому при сохранении в любых других форматах, таких как Jpeg... заставит потерять прозрачность. Надеюсь, это поможет.


хотя вопрос очень старый, но все же здесь код работает для меня.

           String jpg1 = FrameImageFilePath;
            String jpg2 = InnerImageFilePath;
            String jpg3 = OutputFilePath;

            Image img1 = Image.FromFile(jpg1);
            Image img2 = Image.FromFile(jpg2);

            int width = img1.Width;
            int height = img1.Height;

            Bitmap img3 = new Bitmap(img1.Width, img1.Height);
            Bitmap img2Resized = new Bitmap(img2, width, height);
            Graphics g = Graphics.FromImage(img3);

            g.Clear(Color.Black);
            g.DrawImage(img2Resized, new Point(0, 0));
            g.DrawImage(img1, new Point(0, 0));

            g.Dispose();
            img1.Dispose();
            img2.Dispose();

            img3.Save(jpg3, System.Drawing.Imaging.ImageFormat.Jpeg);
            img3.Dispose();

Я предположил, что FilterIndex диалогового окна начинается с 0...но на самом деле он начинается с 1, поэтому мои изображения сохраняются как GIF с использованием Альфа-прозрачности, а gif не поддерживает Альфа-прозрачность. Итак, моя проблема была на самом деле с диалоговым окном.