Преобразование растровых пиксельных форматов в C # - PullRequest
44 голосов
/ 07 января 2010

Мне нужно преобразовать растровое изображение из 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. Что происходит / как мне конвертировать формат?

Ответы [ 3 ]

79 голосов
/ 07 января 2010

Неряшливый, не редкость для 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...
30 голосов
/ 19 ноября 2011

По какой-то причине, если вы создаете 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.
}
7 голосов
/ 07 января 2010
using (var bmp = new Bitmap(width, height, PixelFormat.Format24bppArgb))
using (var g = Graphics.FromImage(bmp)) {
  g.DrawImage(..);
}

Должно работать так. Возможно, вы хотите установить некоторые параметры на g, чтобы определить режим интерполяции качества и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...