Преобразование Bitmap PixelFormats в С#
Мне нужно преобразовать растровое изображение с PixelFormat.Format32bppRgb
в PixelFormat.Format32bppArgb
.
Я надеялся использовать Bitmap.Clone, но он, похоже, не работает.
Bitmap orig = new Bitmap("orig.bmp");
Bitmap clone = orig.Clone(new Rectangle(0,0,orig.Width,orig.Height), PixelFormat.Format24bppArgb);
Если я запустил вышеуказанный код, а затем проверю clone.PixelFormat, он будет установлен в PixelFormat.Format32bppRgb
. Что происходит/как преобразовать формат?
Ответы
Ответ 1
Sloppy, не редкость для GDI+. Это исправление:
Bitmap orig = new Bitmap(@"c:\temp\24bpp.bmp");
Bitmap clone = new Bitmap(orig.Width, orig.Height,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
using (Graphics gr = Graphics.FromImage(clone)) {
gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
}
// Dispose orig as necessary...
Ответ 2
По какой-то причине, если вы создаете Bitmap
из пути к файлу, то есть Bitmap bmp = new Bitmap("myimage.jpg");
и вызываете Clone()
на нем, возвращаемый Bitmap
не будет преобразован.
Однако, если вы создадите еще один Bitmap
из старого Bitmap
, Clone()
будет работать по назначению.
Попробуйте что-то вроде этого:
using (Bitmap oldBmp = new Bitmap("myimage.jpg"))
using (Bitmap newBmp = new Bitmap(oldBmp))
using (Bitmap targetBmp = newBmp.Clone(new Rectangle(0, 0, newBmp.Width, newBmp.Height), PixelFormat.Format32bppArgb))
{
// targetBmp is now in the desired format.
}
Ответ 3
using (var bmp = new Bitmap(width, height, PixelFormat.Format24bppArgb))
using (var g = Graphics.FromImage(bmp)) {
g.DrawImage(..);
}
Должно работать так. Возможно, вы хотите установить некоторые параметры на g
, чтобы определить режим интерполяции для качества и т.д.