Как диагностировать ошибки freeimage loadfromstream

Я использую оболочку C# FreeImage. Я пытаюсь открыть файл PDF, содержащий изображения, и "извлечь" эти изображения в объекты растрового изображения Windows. Я следую рекомендациям, описанным в статьях в Интернете, следуя в общих чертах следующей схеме:

byte[] bytes = GetPdfFile();

iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(bytes);

int pageNumber = 0;
for (int i = 0; i <= reader.XrefSize - 1; i++)
{
    pdfObj = reader.GetPdfObject(i);
    if ((pdfObj != null) && pdfObj.IsStream())
    {
        pdfStream = (iTextSharp.text.pdf.PdfStream)pdfObj;
        iTextSharp.text.pdf.PdfObject subtype = pdfStream.Get(iTextSharp.text.pdf.PdfName.SUBTYPE);
        if ((subtype != null) && subtype.ToString().Equals(iTextSharp.text.pdf.PdfName.IMAGE.ToString()))
        {
            pageNumber++;
            byte[] imgBytes = iTextSharp.text.pdf.PdfReader.GetStreamBytesRaw((iTextSharp.text.pdf.PRStream)pdfStream);
            if ((imgBytes != null))
            {
                // in my case images are in TIF Group 4 format
                using (MemoryStream ms = new MemoryStream(imgBytes))
                {
                    FreeImageAPI.FIBITMAP bmp = FreeImageAPI.FreeImage.LoadFromStream(ms);

                    // in my case bmp with IsNull = true is returned
                    if (!bmp.IsNull)
                    {
                        using (MemoryStream msOut = new MemoryStream())
                        {
                            FreeImageAPI.FreeImage.SaveToStream(bmp, msOut, ... ); // etc.
                        }
                    }
                }
            }
        }
    }
}

Кто-нибудь есть предложение о том, как решить эту проблему, учитывая, что не возвращается исключение - какая-то функция GetLastError FreeImage? Спасибо

1 ответ

Хотя не похоже, что функция SetOutputMessage была добавлена ​​в библиотеку оболочки.NET, ее можно вызвать непосредственно из библиотеки FreeImage.

То есть добавление функции в ваш код с помощью:

  [DllImport("FreeImage", EntryPoint = "FreeImage_SetOutputMessage")]
  internal static extern void SetOutputMessage(OutputMessageFunction outputMessageFunction);

Следующий код показывает исключение, которое выдается из функции Save, а не возвращает false (со следующим выводом на консоль):

Тест 1... Успех
Тест 2...
Необработанное исключение: System.Exception: только 24-битные высококачественные или 8-битные растровые изображения в градациях серого / палитре могут быть сохранены в формате JPEG
в ConsoleApplication1.Program.OutputMessage(формат FREE_IMAGE_FORMAT, строковое сообщение) ...\ConsoleApplication1\Program.cs: строка 35
в FreeImageAPI.FreeImage.Save(FREE_IMAGE_FORMAT пятнадцатая, FIBITMAP dib, строковое имя файла, флаги FREE_IMAGE_SAVE_FLAGS)
в ConsoleApplication1.Program.Main(String[] args) в... \ ConsoleApplication1 \ Program.cs: строка 28

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using FreeImageAPI;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {  FIBITMAP bitmap;
         bool    success;

         SetOutputMessage(OutputMessage);

         Console.Write("Test 1... ");
         bitmap = FreeImage.CreateFromBitmap(new Bitmap(320, 240, PixelFormat.Format24bppRgb));
         success = FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, bitmap, "output.jpg",   FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYNORMAL);
         FreeImage.Unload(bitmap);
         Console.WriteLine("Success");

         Console.Write("Test 2... ");
         bitmap = FreeImage.CreateFromBitmap(new Bitmap(320, 240));
         success = FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, bitmap, "output.jpg",   FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYNORMAL);
         FreeImage.Unload(bitmap);
         Console.WriteLine("Success");

      }

      static void OutputMessage(FREE_IMAGE_FORMAT format, string message)
      {  throw new Exception(message);
      }

      [DllImport("FreeImage", EntryPoint = "FreeImage_SetOutputMessage")]
      internal static extern void SetOutputMessage(OutputMessageFunction outputMessageFunction);

   }
}
Другие вопросы по тегам