Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python svglib-为什么在将双色SVG转换为PNG时会添加数百种附加颜色?_Python_Svg_Reportlab - Fatal编程技术网

Python svglib-为什么在将双色SVG转换为PNG时会添加数百种附加颜色?

Python svglib-为什么在将双色SVG转换为PNG时会添加数百种附加颜色?,python,svg,reportlab,Python,Svg,Reportlab,当我使用转换为PNG,为什么包含316种颜色 from svglib.svglib import svg2rlg from reportlab.graphics import renderPM drawing = svg2rlg("openweb.svg") renderPM.drawToFile(drawing, "converted_file.png", fmt="PNG", dpi=72) 使用cv2和numpy确认颜色的数量

当我使用转换为PNG,为什么包含316种颜色

from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM

drawing = svg2rlg("openweb.svg")
renderPM.drawToFile(drawing, "converted_file.png", fmt="PNG", dpi=72)
使用
cv2
numpy
确认颜色的数量:

import cv2 
import numpy as np

img = cv2.imread(png_file, cv2.IMREAD_COLOR)  # Read PNG file
colours = img.reshape(-1, img.shape[2])  # Get colours
unique_colours = np.unique(colours, axis=0)  # Get unique colours
print('\nPNG colour count:\n ', len(unique_colours))
哪些产出:

PNG colour count:
  316
以下是的代码,包含两种颜色:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 84 118">
  <path d="M62,3c0,45,55,78-21,114c-5-40-80-61,21-114" fill="#5e962d"/>
  <path d="M17,15c6,35-52,65,24,102c50-37,46-80-24-102" fill="#8ad945"/>
</svg>

这是png文件,包含316种颜色:

SVG与PNG的比较:

放大后,请注意如何在边缘添加额外的绿色阴影:

使用Photoshop的直方图确认这些附加颜色:


svglib
renderPM
中的什么时候添加这些额外的颜色,是否可以覆盖此行为以使PNG颜色与SVG的颜色匹配(即2种颜色+背景)?

我不熟悉所涉及的库,但显而易见的猜测是,从矢量格式转换为光栅格式(可能是renderrpm.drawToFile)的任何步骤都会执行抗锯齿,即通过添加,例如,白色背景上黑线边缘的灰色像素。

我不熟悉所涉及的库,但显而易见的猜测是,从矢量格式转换为光栅格式(可能是RenderRPM.drawToFile)的任何步骤都会执行抗锯齿,即通过添加,例如,白色背景上黑线边缘的灰色像素。

请发布此类图片以及源svg文件。我已更新了问题,将照片和原始svg文件包括在内。是的,即抗锯齿,即svglib花费更多精力绘制更好的图片。我不熟悉svglib或高级svg功能,但这可能会有所帮助:谢谢。经过进一步调查,在svglib中似乎无法关闭抗锯齿功能。我的理解是,在python中,如果不从头构建渲染引擎,就无法解决抗锯齿问题。我做到了,似乎处理
shape rendering=“crispEdges”
依赖于渲染引擎。它适用于Firefox、Chrome等,但不幸的是,它看起来像是
svglib
使用
libart
进行渲染,而忽略了
形状渲染
。我尝试在根目录、路径以及两者中添加
shape rendering=“crispEdges”
,但仍然没有成功。从我所读到的内容来看,我相信Inkscape和其他python SVG库(如Cairo)也不提供此功能,因为我认为它们基于相同的底层渲染引擎。请发布这样的图片以及源SVG文件。我已经更新了问题,以包括照片和原始SVG文件是的,即抗锯齿,也就是说,svglib花费更多的精力来绘制更好的图片。我不熟悉svglib或高级svg功能,但这可能会有所帮助:谢谢。经过进一步调查,在svglib中似乎无法关闭抗锯齿功能。我的理解是,在python中,如果不从头构建渲染引擎,就无法解决抗锯齿问题。我做到了,似乎处理
shape rendering=“crispEdges”
依赖于渲染引擎。它适用于Firefox、Chrome等,但不幸的是,它看起来像是
svglib
使用
libart
进行渲染,而忽略了
形状渲染
。我尝试在根目录、路径以及两者中添加
shape rendering=“crispEdges”
,但仍然没有成功。从我所读到的内容来看,我相信Inkscape和其他python SVG库(如Cairo)也不提供此功能,因为我认为它们基于相同的底层渲染引擎。我已经更新了我的问题,以包括一个放大的PNG。似乎正在进行抗锯齿处理。我以为它发生在
renderrpm.drawToFile
中的某个地方,但是我在
renderrpm.drawToFile
中找不到任何代码,它似乎可以处理这种颜色的“混合”。同样,我在
svglib
中也找不到任何明显的东西。我很困惑。我希望,如果我能准确地找出这种抗锯齿发生的地方,那么这种行为就可以被操纵了。或者很简单,在转换过程中传递一个参数,比如
aa=off
,但是我找不到任何文档。它看起来像reportlab用于渲染,libart无法关闭抗锯齿,但我可能错了……看起来你是对的。在进一步研究之后,我认为不可能使用现有的渲染引擎将SVG转换为python中的别名PNG图像。因此,我决定使用最近邻法近似消除混叠像素,将其压缩为有限数量的颜色,而不是构建自己的渲染引擎。如果有人感兴趣,下面是代码:。它不是完美的,通常近似于错误的颜色,但是我发现这是一个很有用的解决方法。我已经更新了我的问题,包括一个放大的PNG。似乎正在进行抗锯齿处理。我以为它发生在
renderrpm.drawToFile
中的某个地方,但是我在
renderrpm.drawToFile
中找不到任何代码,它似乎可以处理这种颜色的“混合”。同样,我在
svglib
中也找不到任何明显的东西。我很困惑。我希望,如果我能准确地找出这种抗锯齿发生的地方,那么这种行为就可以被操纵了。或者很简单,在转换过程中传递一个参数,比如
aa=off
,但是我找不到任何文档。它看起来像reportlab用于渲染,libart无法关闭抗锯齿,但我可能错了……看起来你是对的。在进一步研究之后,我认为不可能使用现有的渲染引擎将SVG转换为python中的别名PNG图像。相反