IMagickImage.Crop() 导致图像模糊

IMagickImage.Crop() causes image to be blurry

我有以下 C# 代码:

MagickImage pdfPage = MyCodeToGetPage();
String barcodePng = "tmp.png"
MagickGeometry barcodeArea = new MagickGeometry(350, 153, 208, 36);
IMagickImage barcodeImg = pdfPage.Clone();
barcodeImg.Crop(barcodeArea);
barcodeImg.Write(barcodePng);

它创建了一个 tmp.png 文件,显示在下方条形码中:

问题是 tmp.png 文件模糊不清,我的条码检测逻辑无法检测到条码。可以看到上图清晰,线条没有合并。

标题说是 Crop() 引起了问题,但也可能是 Write()。

如何从 pdf 中裁剪条形码而不会使 tmp.png 模糊?

当源文档是 .tif 时,这不是问题。更准确地说,如果我将 .pdf 转换为 .tif,然后对其进行裁剪,则 .png 足够清晰,可以检测到条形码。我想消除中间 .tif,因为它使用笨拙的打印机 driver 进行转换。

这个 URL 有答案: http://www.jiajianhudong.com/question/642668.html

为了修复它,我将代码更改为:

MagickImage pdfPage = MyCodeToGetPage();
String barcodePng = "tmp.png"
MagickGeometry barcodeArea = new MagickGeometry(350, 153, 208, 36);
IMagickImage barcodeImg = pdfPage.Clone();
barcodeImg.ColorType = ColorType.Bilevel;
barcodeImg.Depth = 1;
barcodeImg.Alpha(AlphaOption.Off);
barcodeImg.Crop(barcodeArea);
barcodeImg.Write(barcodePng);

修复最关键的部分是更改:

using (MagickImageCollection tiffPageCollection = new MagickImageCollection())
{
    tiffPageCollection.Read(tifName);

var settings = new MagickReadSettings { Density = new Density(200) };

using (MagickImageCollection tiffPageCollection = new MagickImageCollection())
{
    tiffPageCollection.Read(tifName, settings);

如果有人想复制我的答案并添加一个明确的理由,为什么在读取时添加密度可以解决问题,我会给他们答案。

正如您在下面的回答中所要求的那样:

增加阅读密度是我在对你的问题的评论中首先提出的建议。它增加了输入光栅化版本的大小。这就像以更高的密度扫描。我通常在 ImageMagick 中做的是以 4 倍标称密度(即 4x72=288)读取 pdf,然后将尺寸缩小 1/4=25%。这通常会给您的结果带来更好的质量。所以我在命令行 ImageMagick 中使用的命令是:

convert -density 288 input.pdf -resize 25% result.suffix


我还要补充一点,Ghostscript 无法处理具有透明度的 CMYK PDF。因此,在阅读 pdf 文件之前,必须将色彩空间更改为 sRGB。所以在这种情况下,它将是:

convert -density 288 -colorspace sRGB input.pdf -resize 25% result.suffix

抱歉,我不会编写 C++ 代码,所以我可能误解了,但我不明白为什么在读取 TIFF 之前增加密度会有什么不同。