Как диагностировать ошибки 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);
}
}