ImageMagick将SVG转换为PNG最右边和最下面的像素

ImageMagick将SVG转换为PNG最右边和最下面的像素,imagemagick,Imagemagick,使用ImageMagick(我使用的是6.3.7)将SVG文件转换为PNG时,右侧和底部的像素线似乎在转换过程中丢失了 例如,考虑这代表一个钻石,完全符合SVG的60x60几何结构。当转换为SVG时,使用 convert diamond.svg diamond.png 它生成(同样大小为60x60像素)。在PNG中,钻石最右边和底部的角已经被剃掉。此外,钻石似乎稍微放大了1个像素 是否有人可以确认此行为,可能提供一些基本原理并可能提供修复?是否有人可以确认此行为,可能提供一些基本原理并可能提供

使用ImageMagick(我使用的是6.3.7)将SVG文件转换为PNG时,右侧和底部的像素线似乎在转换过程中丢失了

例如,考虑这代表一个钻石,完全符合SVG的60x60几何结构。当转换为SVG时,使用

convert diamond.svg diamond.png
它生成(同样大小为60x60像素)。在PNG中,钻石最右边和底部的角已经被剃掉。此外,钻石似乎稍微放大了1个像素

是否有人可以确认此行为,可能提供一些基本原理并可能提供修复?

是否有人可以确认此行为,可能提供一些基本原理并可能提供修复

  • SVG是一种矢量格式,因此不知道像素(除非将像素图像嵌入SVG…)

  • 但是,SVG路径的尺寸是以像素为单位定义的。这就是为什么它的尺寸是60x60

  • 渲染SVG(在Inkscape或任何SVG查看器中显示)时,可以看到图像的无缩放,并且永远不会发现像素化(除非使用放大镜查看监视器屏幕的像素)

  • 但是,PNG不是矢量格式,它是一种位图格式,由像素组成。要绘制黑色对角边,它需要使用“阶梯”黑色像素(可能通过在中间添加一些灰度像素来平滑,以实现一点抗锯齿效果)

  • 当您要求ImageMagick将钻石转换为60x60像素大小的PNG时,它只有一个60x60网格来创建对角线

  • 现在进行计算:你怎么能将一个从1像素高度到30像素高度(这是第31步,你算过了吗?)再回到1像素高度(这是第61步,你算过了吗?)的“perfekt”像素阶梯填充到这样的网格中你不能

  • 唯一可以保持完美形状的“修复”(如您所观察到的,没有“剃掉”效果)是缩放PNG以使用61x61(或122x122)的大小:

  • 将小矢量图形转换为小像素图形将始终“松散”一些东西,并且始终需要您做出一些妥协才能被接受


  • 你看过我的答案吗?
    convert diamond.svg -resize 61x61 +antialias diamond.png
    
    rsvg-convert -w 61 -h 61 -o diamond-rsvg.png diamond.svg