使用Magick ++将PDF / SVG转换为PNG并使用抗锯齿关闭

时间:2018-04-23 09:56:46

标签: svg imagemagick imagemagick-convert magick++

我试图在Magick ++中使用抗锯齿功能将SVG文件转换为PNG但我没有成功。但我能够使用其他程序将SVG文件转换为PDF,并使用ImageMagick convert命令将PDF文件转换为PNG。 我如何使用ImageMagick来做到这一点?我用于将PDF转换为PNG的命令是:

convert +antialias -interpolate Nearest -filter point -resize 1000x1000 "img.pdf" PNG24:"filter.png"

有没有办法使用Magick ++做到这一点或更好,直接将SVG转换为PNG并使用抗锯齿关闭?

提前致谢。

修改

this post中给出的答案对我不起作用。可能因为我使用的是彩色SVG而不是1位alpha通道。我在我的问题中也提到我也想在Magick ++中找到一种方法。

1 个答案:

答案 0 :(得分:2)

Magick ++拥有Magick::Image::textAntiAlias& Magick::Image::strokeAntiAlias方法可用,但只有在解析SVG并一次重建一个SVG元素(即自行装配SVG引擎)时,它们才有用。

正如@ccprog在评论中指出的那样;一旦解码器实用程序对矢量进行光栅处理,就会完成损坏。设置标志不会对生成的调整大小产生影响。

没有看到SVG,我只能推测问题是什么。我建议在阅读SVG内容之前设置文档 size

例如,以小于重新取样的尺寸读取图像。

Magick::Image img;
img.size(Magick::Geometry(100, 100)); // Decode to a small context
img.read("input.svg");
img.interpolate(Magick::NearestInterpolatePixel);
img.filterType(Magick::PointFilter);
img.resize(Magick::Geometry(600, 600));
img.write("PNG24:output@100x100.png");

output @ 100x100

或者以更大的尺寸渲染到最终图像。

Magick::Image img;
img.size(Magick::Geometry(1000, 1000)); // Decode to a larger context
img.read("input.svg");
img.interpolate(Magick::NearestInterpolatePixel);
img.filterType(Magick::PointFilter);
img.resize(Magick::Geometry(600, 600));
img.write("PNG24:output@1000x1000.png");

output @ 1000x1000

从评论中更新

对于Postscript(PDF)& True-Type抗锯齿,您可以将Magick::Image::textAntiAlias(或Magick::Image::antiAlias,如果使用IM6)设置为false。只需确保将密度设置为允许任何开销。

Magick::Image img;
img.density(Magick::Point(300));
if (MagickLibVersion < 0x700) {
    img.antiAlias(false);
} else {
    img.textAntiAlias(false);
}
img.interpolate(Magick::NearestInterpolatePixel);
img.filterType(Magick::PointFilter);
img.read("input.pdf");
img.resize(Magick::Geometry(1000, 1000));
img.write("PNG24:output.png");