32-битный rgb bmp в 24-битный rgb bmp в проблеме С#

Мне нужно преобразовать 32-битные изображения rgb bmp в 24-битные изображения rgb bmp.

Это то, что я пытаюсь сделать

Bitmap b1=new Bitmap(sorecFileName);

Bitmap b2=new 

Bitmap(b1.Size.Width,b1.Size.Height,System.Drawing.Imaging.PixelFormat.Format24bppRgb);       
b2.SetResolution(b1.HorizontalResolution, b1.VerticalResolution);

Graphics g=Graphics.FromImage(b2);

g.DrawImage(b1,0,0);

//continue to draw on g here to add text or graphics.

g.Dispose();

b2.Save(destinationFileName);

Код отлично компилируется и генерирует выходное изображение 24bpp, но оно больше не в формате rgb. Почему это так?

Я понял это, поскольку у меня есть библиотека, которая принимает изображение как rgb24 и отображает его. Поэтому, когда я пытаюсь передать файл, сгенерированный приведенным выше кодом, в качестве входных данных для функции, он отображает зашумленное изображение.

Однако, если я открою тот же файл в краске и сохраню его как 24bpp bmp и введу его в функцию, изображение будет отображаться нормально. Что мне не хватает?


person nightWatcher    schedule 11.02.2011    source источник


Ответы (2)


  b2.Save(destinationFileName);

Вы не указали формат файла изображения. По умолчанию используется формат PNG, а не BMP. Теперь у вас, вероятно, есть файл .bmp на диске, который на самом деле содержит изображение PNG. Это может долгое время оставаться незамеченным, многие графические программы обращают внимание на заголовок файла, а не на расширение имени файла. MSPaint, например, без проблем загрузит файл. Как и любая другая программа, использующая GDI+. Вам может не повезти с программой, которая слепо предполагает, что файл содержит BMP, и вообще не проверяет его. Исправить:

  b2.Save(destinationFilename, System.Drawing.Imaging.ImageFormat.Bmp);
person Hans Passant    schedule 11.02.2011
comment
Улучшите проверку ошибок в этой библиотеке. Подобные несчастья не редкость, когда-нибудь это произойдет снова. - person Hans Passant; 11.02.2011
comment
.. Спасибо миллион, это было именно то, чего мне не хватало - person nightWatcher; 11.02.2011

если у вас есть черное изображение - добавьте g.Clear(Color.White);

person Rajesh Abraham    schedule 05.10.2011