使用Magick+;将PDF/SVG转换为PNG,禁用反别名+;

使用Magick+;将PDF/SVG转换为PNG,禁用反别名+;,svg,imagemagick,imagemagick-convert,magick++,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,但没有成功。但我能够用另一个程序将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

提前谢谢

编辑


中给出的答案对我不适用。可能是因为我使用的是彩色SVG,而不是1位alpha通道。我在问题中还提到,我也在寻找一种在Magick++中实现这一点的方法。

Magick++有
Magick::Image::textAntiAlias
&
Magick::Image::strokeAntiAlias
方法可用,但它们只有在解析SVG并重建图像时才有用(即,启动自己的SVG引擎)一次一个SVG元素

正如@ccprog在评论中指出的那样;一旦解码器实用程序对向量进行光栅化,就会造成损坏&设置标志不会对结果的大小产生影响

没有看到SVG,我只能推测问题出在哪里。我建议在阅读SVG内容之前设置文档大小

例如,以比重采样更小的尺寸读取图像

Magick::图像img;
图像大小(Magick::Geometry(100100));//解码到一个小上下文
img.read(“input.svg”);
插值(Magick::NearestInterpolatePixel);
img.filterType(Magick::PointFilter);
调整大小(Magick::Geometry(600600));
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类型的抗锯齿,您可以将
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");
Magick::图像img;
图像密度(Magick::Point(300));
如果(MagickLibVersion<0x700){
img.反别名(假);
}否则{
img.textAntiAlias(假);
}
插值(Magick::NearestInterpolatePixel);
img.filterType(Magick::PointFilter);
img.read(“input.pdf”);
调整大小(Magick::Geometry(10001000));
img.write(“PNG24:output.png”);

可能重复@ccprog请重新阅读问题,因为我已经编辑了它。这个问题是不同的。ImageMagick使用Inkscape或librsvg渲染SVG,并且有一个备用内部渲染器。它们都不能控制抗锯齿。相反,对于PS/PDF,将使用具有适当选项的导入ghostscript。(请注意,图像的IM内部表示是基于像素的,因此一旦导入,任何损坏都已经造成。)@ccprog谢谢。我现在只想使用Magick++(不带反别名)将PDF转换为PNG,但这会生成新的像素(反别名),我根本不需要它(甚至一个像素都不需要)。但是我展示了我用于将PDF转换为PNG的命令,这样就可以使用ImageMagick进行转换。如何使用Magick++(PDF到PNG,antialias)实现此功能。