Bitmap.Save (stream, codecInfo, encoderparam) - не работает
От: ASolovey Россия  
Дата: 24.03.04 22:06
Оценка:
Коллеги,

есть задача: нужно на .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;
        }
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.