растровое изображение 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
Я просто хотел напомнить всем, что 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 не поддерживает Альфа-прозрачность. Итак, моя проблема была на самом деле с диалоговым окном.