IMagickImage.Crop()导致图像模糊

时间:2019-08-08 02:42:40

标签: c# imagemagick

我有以下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文件,该文件显示在下面的下部条形码中:

enter image description here

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

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

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

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

2 个答案:

答案 0 :(得分:1)

按照您在下面的答案中的要求:

在阅读中添加密度是我在对您的问题的评论中首先建议的内容。它增加了输入的栅格化版本的大小。就像以更高的密度扫描一样。我通常在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之前增加密度会产生什么影响。

答案 1 :(得分:0)

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

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