c # Bitmap. Сохранение прозрачности не сохраняет в png - PullRequest
9 голосов
/ 05 февраля 2010

Я пытаюсь сохранить класс Bitmap с прозрачностью в виде файла png с прозрачностью. Мне не повезло.

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

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

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

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

1010 * сохранение на носители * ret.Save(filename, ImageFormat.Png); Я также пытался сохранить файл с файловым потоком, и это не имело никакого значения. Когда изображение находится в графическом окне, прозрачность существует, но при сохранении я получаю черный фон. Я действительно не хочу использовать какой-либо сторонний код, они нашли способ сделать это, я бы тоже хотел. спасибо.

Ответы [ 10 ]

7 голосов
/ 05 октября 2011

Вы уверены, что формат пикселя растрового изображения System.Drawing.Imaging.PixelFormat.Format32bppArgb ? Я просто наткнулся на этот вопрос, потому что у меня возникла та же проблема, но это было потому, что я загружал изображение, в котором не было альфа-компонента, в его пиксельный формат. Я сделал

    Bitmap output = original.Clone(rect, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

и он правильно сохранил PNG с альфа-компонентом.

Кроме того, если вы используете MakeTransparent () , убедитесь, что цвет, который вы делаете прозрачным, существует в вашем изображении.

2 голосов
/ 06 июня 2012

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

Вам нужно разыграть Bitmap до 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
2 голосов
/ 05 февраля 2010

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

2 голосов
/ 05 февраля 2010
ret.MakeTransparent(...);
2 голосов
/ 05 февраля 2010

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

РЕДАКТИРОВАТЬ: Ах, нашел пример здесь

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

РЕДАКТИРОВАТЬ 2: После более подробного изучения этого вопроса, я думаю, что промежуточный шаг требуется только при определенных обстоятельствах.

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

1 голос
/ 03 февраля 2016

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

0 голосов
/ 11 июля 2016

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

           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();
0 голосов
/ 03 апреля 2015

Портативные форматы Network 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 ... потеряет прозрачность. Надеюсь, это поможет.

0 голосов
/ 06 октября 2011

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

0 голосов
/ 28 мая 2010

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

...