Преобразование из Format8bppIndexed в Format24bppRgb в C # / GDI + - PullRequest
6 голосов
/ 23 марта 2009

Хорошо, у меня есть изображение, полученное из внешнего приложения в 8-битном индексированном формате. Мне нужно, чтобы это изображение было преобразовано в 24-битный формат точно такого же размера.

Я попытался создать новое растровое изображение того же размера и типа Format24bppRgb, а затем с помощью объекта Graphics нарисовать 8-битное изображение поверх него перед сохранением его в виде Bmp. Этот подход не ошибается, но когда я открываю полученное изображение, заголовок BMP имеет все возможные значения. Высота и ширина ОГРОМНЫ и, кроме того, есть забавные (и большие) значения для флагов сжатия и некоторых других. К сожалению, мои особые требования - передать этот файл конкретному драйверу принтера, для которого требуется 24-битное изображение с определенными значениями заголовка (чего я пытаюсь достичь с помощью GDI +)

Кто-нибудь знает пример "конвертации" проиндексированного файла в неиндексированный 24-битный файл? Если не пример, по какому пути я должен начать писать свой собственный?

-Кевин Гросниклаус kvgros@sseinc.com

Ответы [ 4 ]

11 голосов
/ 23 марта 2009

Я использовал приведенный ниже код, чтобы «преобразовать» изображение с 8 до 24 бит / с. Проверка сгенерированного файла 24bpp с помощью шестнадцатеричного редактора и сравнение с файлом 8bpp не показывает разницы в высоте и ширине в двух файлах. То есть изображение размером 8 бит на пиксель было 1600x1200, а изображение на 24 бит на пиксель имеет те же значения.

    private static void ConvertTo24(string inputFileName, string outputFileName)
    {
        Bitmap bmpIn = (Bitmap)Bitmap.FromFile(inputFileName);

        Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
        using (Graphics g = Graphics.FromImage(converted))
        {
            // Prevent DPI conversion
            g.PageUnit = GraphicsUnit.Pixel
            // Draw the image
            g.DrawImageUnscaled(bmpIn, 0, 0);
        }
        converted.Save(outputFileName, ImageFormat.Bmp);
    }

Все остальное в заголовках выглядит разумно, и изображения отображаются в моей системе идентично. Какие "прикольные ценности" вы видите?

4 голосов
/ 08 июня 2011

Это мой код конверсии. Обратите внимание на соответствие разрешения между исходным и результирующим изображениями.

    private void ConvertTo24bppPNG(Stream imageDataAsStream, out byte[] data)
    {
        using ( Image img = Image.FromStream(imageDataAsStream) )
        {
            using ( Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb) )
            {
                // ensure resulting image has same resolution as source image
                // otherwise resulting image will appear scaled
                bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);

                using ( Graphics gfx = Graphics.FromImage(bmp) )
                {
                    gfx.DrawImage(img, 0, 0);
                }

                using ( MemoryStream ms = new MemoryStream() )
                {
                    bmp.Save(ms, ImageFormat.Png);
                    data = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(data, 0, (int) ms.Length);
                }
            }
        }
    }
0 голосов
/ 23 марта 2009

Проблема, вероятно, заключается в разнице между вертикальным и горизонтальным разрешением исходного изображения и выходного изображения. Если вы загружаете индексированное растровое изображение 8 бит на пиксель с разрешением 72 DPI, а затем создаете новое растровое изображение на 24 бит на пиксел (разрешение по умолчанию будет 96 DPI ... по крайней мере, в моей системе), а затем используете Graphics.DrawImage для перехода к новому растровое изображение, изображение будет слегка увеличено и обрезано.

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

0 голосов
/ 23 марта 2009

Кажется странным, что вы создаете растровое изображение той же ширины и высоты, что и ваши входные данные, но сгенерированный BMP намного больше. Можете ли вы опубликовать код?

...