我正在使用C#FreeImage包装。 我试图打开一个包含图像的PDF文件,并将这些图像“提取”到窗口位图对象中。我下面在互联网上的文章中描述的指导方针,遵循松散以下模式:如何诊断freeimage loadfromstream错误
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的功能? 谢谢
一些搜索我发现的FreeImage具有映射到一个FreeImageAPI.FreeImage方法SetOutputMessage .OutputMessageProc C#wrapper方法 - 但我不太清楚如何使用它 - 因为它看起来不是一个委托/将一个函数当作参数...这里是另一个触及问题的链接http://sourceforge.net/p/freeimage/discussion/36111/thread/8ccaebf8/ – 2014-12-04 16:42:13
似乎存在一个委托方法FreeImageAPI.FreeImageEngine.Message,它接受通常的函数通过+ =的方式,但它似乎并没有在我的情况下被称为 - 通过imgBytes(这是PDF图像对象的原始字节)直接输出到磁盘给出的东西,即使IrfanView不承认作为图片 – 2014-12-05 12:57:45
好吧,据我了解,freeimage API也会查找图像数据的头部以确定图像格式 - 因此,与标准的System.Drawing对象(比如位图)相比,它并不比我想要做的更好。此外,如果在pdfStream的Filter“属性”中指定了原始字节,我必须对原始字节执行FlateDecode--之后,我要求将原始图像数据逐行复制到新的Bitmap对象,使用Stride等进行正确对齐。正如下面指出的 – 2014-12-10 10:59:37