Коллеги,
есть задача: нужно на .NET (лучше на C#) сконвертировать jpeg в bmp с 8bit на точку.
По ходу разбирательства с ImageCodecInfo, EncoderParameters итд нашел пример на смежную тему в MSDN.
В нем конвертируется bmp'шка в tiff 24bit. См. код ниже. Так вот, если поставить в качестве значения параметра не 24L, как в примере, а скажем 8L (как мне надо) — возникает внутренняя ошибка GDI+. При этом значение 8 — является допустимым для данного параметра, посмотрел утилитой:
http://www.rsdn.ru/article/gdi/gdiplus2mag/Codecs_EXE.zip
Исходный файл — bmp 32bit.
1) Есть идеи, почему так происходит?
2) Encoder для bmp не поддерживает параметров вообще. Пробовал влобовую: ковертировал jpeg в gif (он 256 цветов), а из него в bmp без всяких encodero'в. Работает, получаю 8Bit, но DPI уменьшается...Ничего не понимаю. Видимо поздновато уже...
using System;
using System.Drawing;
using System.Drawing.Imaging;
class Example_SetColorDepth
{
public static void Main()
{
Bitmap myBitmap;
ImageCodecInfo myImageCodecInfo;
Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
// Create a Bitmap object based on a BMP file.
myBitmap = new Bitmap("c:\\1.bmp");
// Get an ImageCodecInfo object that represents the TIFF codec.
myImageCodecInfo = GetEncoderInfo("image/tiff");
// Create an Encoder object based on the GUID
// for the ColorDepth parameter category.
myEncoder = Encoder.ColorDepth;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
myEncoderParameters = new EncoderParameters(1);
// Save the image with a color depth of 24 bits per pixel.
myEncoderParameter =
new EncoderParameter(myEncoder, 24L);
myEncoderParameters.Param[0] = myEncoderParameter;
myBitmap.Save("c:\\2.tiff", myImageCodecInfo, myEncoderParameters);
}
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for(j = 0; j < encoders.Length; ++j)
{
if(encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
}