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 之前增加密度会有什么不同。
我有以下 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 之前增加密度会有什么不同。