C# Crop()导致图像模糊

C# Crop()导致图像模糊,c#,imagemagick,C#,Imagemagick,我有以下C#代码: 它将创建一个tmp.png文件,该文件显示在下面较低的条形码中: 问题是tmp.png文件模糊,我的条形码检测逻辑无法检测到条形码。您可以看到上面的图像是清晰的,线没有合并 标题中说是Crop()导致了问题,但也可能是Write() 如何在不使tmp.png模糊的情况下从pdf中裁剪条形码 当源文档为.tif时,这不是问题。更准确地说,如果我将.pdf转换为.tif,然后对其进行裁剪,.png足够清晰,可以检测到条形码。我想消除中间.tif,因为它使用了笨拙的打印机驱动程序

我有以下C#代码:

它将创建一个tmp.png文件,该文件显示在下面较低的条形码中:

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

标题中说是Crop()导致了问题,但也可能是Write()

如何在不使tmp.png模糊的情况下从pdf中裁剪条形码

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

此URL的答案是:

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

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);


如果有人想复制我的答案,并添加一个明确的原因,说明为什么在阅读中添加密度可以解决问题,我会给他们答案

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

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

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

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

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

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

当你读PDF时,你在默认的72 DPI上进行光栅化。这并没有产生足够的质量。您需要以更大的密度进行栅格化(然后可以选择向下调整大小),然后以更高的密度进行裁剪。因此,在读取PDF之前,需要指定更大的密度。如果您发布了PDF的链接,我可以在ImageMagick命令行中向您演示如何使用。@fmw42我的屏幕截图显示的是72 dpi图像作为上面的条形码。你可以看到线条清晰。多年来,当它被转换成.tiff并被裁剪时,它的质量已经足够了。简单的裁剪不应使图像模糊。在我将增加dpi作为解决方案之前,我希望使裁剪不会使图像模糊。您的鬼脚本是否更改了版本?ImageMagick使用Ghostscript。如果其版本已更改或任何参数已更改,则这可能是原因。这是发生在所有PDF中还是仅此一个?此程序专门用于处理所有以相同方式生成的PDF。我没有尝试过其他.PDFs,但它与此无关,因为此程序将仅使用我从其他代码生成的PDF运行。Ghostscript没有更改。正如承诺的那样,即使您没有显示C#代码,我也会给您带来胜利。你的答案是对的,我只是不知道如何把它翻译成C代码进行测试。