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
是否可以检测SVG内部的独特颜色?_Svg_Vector_Imagemagick_Inkscape - Fatal编程技术网

是否可以检测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

我想访问SVG可能使用的所有颜色。我已经使用了
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文件。代码:有趣;好的,我有很多研究要做:)谢谢你的帮助。我一试就会跟进。