是否可以检测SVG内部的独特颜色?
我想访问SVG可能使用的所有颜色。我已经使用了是否可以检测SVG内部的独特颜色?,svg,vector,imagemagick,inkscape,Svg,Vector,Imagemagick,Inkscape,我想访问SVG可能使用的所有颜色。我已经使用了convert,但是我想了解一些关于如何找出SVG可能包含的独特颜色的指导 这是我编写的PHP代码,用于与convert对话,以尝试确定位图是否包含颜色,但它非常有限: /** * containsColor * * @see https://www.imagemagick.org/discourse-server/viewtopic.php?t=19580&start=15 * @see https://super
convert
,但是我想了解一些关于如何找出SVG可能包含的独特颜色的指导
这是我编写的PHP代码,用于与convert
对话,以尝试确定位图是否包含颜色,但它非常有限:
/**
* containsColor
*
* @see https://www.imagemagick.org/discourse-server/viewtopic.php?t=19580&start=15
* @see https://superuser.com/questions/508472/how-to-recognize-black-and-white-images
* @see https://www.imagemagick.org/discourse-server/viewtopic.php?t=19580
* @access public
* @static
* @param string $path
* @return bool
*/
public static function containsColor(string $path): bool
{
$commands = array(
'convert ' .
($path) .' ' .
'-format "%[colorspace]" info:'
);
$command = implode(' && ', $commands);
$response = exec($command);
$color = strtolower($response) !== 'gray';
return $color;
}
如果我们查看文档,我们应该能够使用-格式%k
识别唯一的颜色计数
公共静态函数containsColor(字符串$path):int
{
$commands=array(
“转换”。
($path)。“”。
“-格式“%k”信息:”
);
$command=内爆(“&&”,$commands);
$response=exec($command);
返回(int)$响应;
}
如果要计算SVG后期渲染使用的所有颜色,可以使用操作符
convert input.svg -depth 8 -unique-colors txt:-
它将输出一些PHP可以轻松解析的内容
# ImageMagick pixel enumeration: 403,1,65535,srgba
0,0: (0,0,0,65535) #000000FF black
1,0: (257,0,0,65535) #010000FF srgba(1,0,0,1)
2,0: (257,257,257,65535) #010101FF srgba(1,1,1,1)
3,0: (257,257,0,65535) #010100FF srgba(1,1,0,1)
4,0: (514,257,0,65535) #020100FF srgba(2,1,0,1)
5,0: (771,771,771,65535) #030303FF grey1
...
请记住,SVG实际上只是XML,因此可以将其加载到类中,并用于提取颜色属性。但正如评论中正确提到的,您将无法识别CSS3过滤器或高级颜色渲染和混合
使用工作示例更新
公共静态函数containsColor(字符串$input):bool
{
$pixelInfoList=[];
exec(sprintf('convert”%s“-depth 8-alpha Off--colors 255-unique colors txt:-',$input),$pixelInfoList);
//…在此处插入错误处理。。。
对于($index=1;$index
不是完美的,而是一个开始
这项工作是评估txt:-
输出的颜色通道。如果红色、绿色和蓝色通道相同,我们可以声明它是灰色并继续到下一行,否则我们可以声明存在非灰色并停止迭代。我还使用了-alpha Off-colors 255
库来完成额外的数据
YMMV这可能对您没有帮助,因为您似乎想将其用于服务器应用程序,但它可能会帮助其他人解决相同的问题 如果您使用的是Inkscape,也可以作为.gpl导出。 文件>保存副本:GIMP调色板(*.gpl)
但是,这不会保存渐变中显示的所有颜色,只保存文件中实际使用的颜色。如果有渐变怎么办?这是站与站之间无限多的颜色。feColorMatrix过滤器呢?@RobertLongson理想情况下,如果定义了渐变(例如),它将被标记为“有色”。感谢@emcconville的快速响应,我对如何解释响应有点不知所措。对于简单的黑色/灰色向量,我得到了有限的响应,比如:但是对于颜色更丰富的向量,我得到了700多行的响应,然后这个没有定义填充或笔划的向量,也用行数:正确。以不同大小渲染的同一矢量图形将极大地改变独特颜色的数量。主要是由于渲染器的抗锯齿和颜色混合。我将用一个可能有效的示例更新我的答案,但您将负责构建一个适合您的本地化业务需求的解决方案。您能否更详细地说明这将实现什么?我之所以这么问是因为Inkscape有一个命令行(CLI)版本,所以如果这完全满足了我的要求,我可能可以查看与之相当的CLI。目前无法调用从命令行导出gimp调色板文件的输出扩展名。这就是为什么我写这对你没有帮助。如果您可以编写一点Python,您可能会将其转换为普通扩展,并从cli使用它(但需要GUI)。它遍历文档并收集找到的所有颜色值,然后另存为.gpl文件。代码:有趣;好的,我有很多研究要做:)谢谢你的帮助。我一试就会跟进。