gpt4 book ai didi

c# - 使用 iTextSharp 提取 FlateDecode 图像

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:11 25 4
gpt4 key购买 nike

我想从 PDF 中提取图像。我现在正在使用 iTextSharp。有些图像可以正确提取,但大多数图像颜色不正确并且失真。我用不同的 PixelFormats 做了一些实验,但我没有得到解决我的问题的方法......

这是区分图像类型的代码:

if (filter == "/FlateDecode")
{
// ...
int w = int.Parse(width);
int h = int.Parse(height);
int bpp = tg.GetAsNumber(PdfName.BITSPERCOMPONENT).IntValue;

byte[] rawBytes = PdfReader.GetStreamBytesRaw((PRStream)tg);
byte[] decodedBytes = PdfReader.FlateDecode(rawBytes);
byte[] streamBytes = PdfReader.DecodePredictor(decodedBytes, tg.GetAsDict(PdfName.DECODEPARMS));

PixelFormat[] pixFormats = new PixelFormat[23] {
PixelFormat.Format24bppRgb,
// ... all Pixel Formats
};
for (int i = 0; i < pixFormats.Length; i++)
{
Program.ToPixelFormat(w, h, pixFormats[i], streamBytes, bpp, images));
}
}

这是将图像保存在 MemoryStream 中的代码。将图片保存在文件夹中,稍后实现。

private static void ToPixelFormat(int width, int height, PixelFormat pixelformat, byte[] bytes, int bpp, IList<Image> images)
{
Bitmap bmp = new Bitmap(width, height, pixelformat);
BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.WriteOnly, pixelformat);
Marshal.Copy(bytes, 0, bmd.Scan0, bytes.Length);
bmp.UnlockBits(bmd);
using (var ms = new MemoryStream())
{
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);
bytes = ms.GetBuffer();
}
images.Add(bmp);
}

请帮帮我。

最佳答案

即使您找到了问题的解决方案,让我说一下修复上面代码的建议。

我认为失真问题是由于行数据边界不匹配造成的。 PdfReader 以字节边界返回数据。例如,对于 20 像素宽的灰度图像,每个图像行将获得 20 个字节的数据。位图类适用于 32 位边界。当创建宽度为 20 像素的位图时,Bitmap 类将生成步幅(字节宽度)=32 字节的灰度位图。这意味着您不能像在 ToPixelFormat() 中那样使用 Marshal.Copy() 方法简单地将检索到的字节从 PdfReader 复制到新位图中。

源字节数组中的第一个像素位于第 21 个字节,但由于位图的 32 位边界,目标位图需要它作为第 33 个字节。为了解决这个问题,我必须创建字节数组,其大小要考虑每个数据行的 32 位边界。

从 PdfReader 检索的字节数组逐行复制数据到新的字节数组,考虑 32 位行边界。现在我有了边界与 Bitmap 类边界匹配的数据字节,因此我可以使用 Marshal.Copy() 将其复制到新的 Bitmap。

关于c# - 使用 iTextSharp 提取 FlateDecode 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com