PixelFormat для PNG изображения в PDF - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь извлечь изображения, используя PDFsharp библиотеку .Как упоминалось в примере программы, библиотека не поддерживает извлечение изображений, отличных от JPEG, поэтому я пытаюсь сделать это самостоятельно.

Я обнаружил нерабочий образец программы для той же цели.Я использую следующий код для извлечения 400 x 400 PNG-изображения, встроенного в файл PDF (изображение было сначала вставлено в файл MS Word, который затем был сохранен как файл PDF).

Ссылка на файл PDF:

https://drive.google.com/open?id=1aB-SrMB3eu00BywliOBC8AW0JqRa0Hbd

КОД ДОБЫЧИ:

 static void ExportAsPngImage(PdfDictionary image, ref int count)
    {
        int width = image.Elements.GetInteger(PdfSharp.Pdf.Advanced.PdfImage.Keys.Width);
        int height = image.Elements.GetInteger(PdfSharp.Pdf.Advanced.PdfImage.Keys.Height);            
        System.Drawing.Imaging.PixelFormat pixelFormat = System.Drawing.Imaging.PixelFormat.Format8bppIndexed;           

        byte[] original_byte_boundary = image.Stream.UnfilteredValue;
        byte[] result_byte_boundary = null;           

        //Image data in BMP files always starts at a DWORD boundary, in PDF it starts at a BYTE boundary.            
        //You must copy the image data line by line and start each line at the DWORD boundary.

            byte[, ,] copy_dword_boundary = new byte[3, height, width];

        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                if (x <= width && (x + (y * width) != original_byte_boundary.Length))
                // while not at end of line, take orignale array
                {
                    copy_dword_boundary[0, y, x] = original_byte_boundary[3*x + (y * width)];
                    copy_dword_boundary[1, y, x] = original_byte_boundary[3*x + (y * width) + 1];
                    copy_dword_boundary[2, y, x] = original_byte_boundary[3*x + (y * width) + 2];
                }
                else //fill new array with ending 0
                {
                    copy_dword_boundary[0, y, x] = 0;
                    copy_dword_boundary[1, y, x] = 0;
                    copy_dword_boundary[2, y, x] = 0;
                }
            }
        }
        result_byte_boundary = new byte[3 * width * height];
        int counter = 0;
        int n_width = copy_dword_boundary.GetLength(2);
        int n_height = copy_dword_boundary.GetLength(1);

        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {   //put 3dim array back in 1dim array
                result_byte_boundary[counter] = copy_dword_boundary[0, x, y];
                result_byte_boundary[counter + 1] = copy_dword_boundary[1, x, y];
                result_byte_boundary[counter + 2] = copy_dword_boundary[2, x, y];

                //counter++;
                counter = counter + 3;
            }
        }


        Bitmap bmp = new Bitmap(width, height, pixelFormat);            
        System.Drawing.Imaging.BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
        System.Runtime.InteropServices.Marshal.Copy(result_byte_boundary, 0, bmd.Scan0, result_byte_boundary.Length);
        bmp.UnlockBits(bmd);
        using (FileStream fs = new FileStream(@"D:\TestPdf\" + String.Format("Image{0}.png", count), FileMode.Create, FileAccess.Write))
        {
            bmp.Save(fs, ImageFormat.Png);
            count++;
        }
    }

ПРОБЛЕМА:

Независимо от выбранного формата PixelFormat сохраненное изображение в формате PNG выглядит неправильно.

Оригинал PNG ИЗОБРАЖЕНИЕ (Битовая глубина-32):

enter image description here

Результат PixelFormat = Format24bppRgb

enter image description here

1 Ответ

0 голосов
/ 13 мая 2019

Вы можете получить формат пикселя из файла PDF.Поскольку вы не включили PDF в свое сообщение, я не могу сказать вам, какой формат будет правильным.

Файлы PDF не содержат изображения PNG, вместо этого изображения используют специальный формат изображения PDF, который несколько похож на BMP.файлы, используемые Windows, но без каких-либо заголовков в двоичных данных.Вместо этого информацию «заголовка» можно найти в свойствах объекта Image.Подробнее см. В справочнике PDF.

...