我试图在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 ++中找到一种方法。
答案 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");
或者以更大的尺寸渲染到最终图像。
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");
从评论中更新
对于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");