我发现GraphicsMagick无法处理以中文命名的文件。我在ImageMagick上做了同样的测试,但IM按预期工作。
我认为这可能是一个错误,因此我在此处提交了错误报告:https://sourceforge.net/p/graphicsmagick/bugs/384/
无论如何,这是重现我的情况:
gm -identify 獅藝學會.jpg
这是命令提示符返回的文本:
>gm -identify 獅藝學會.jpg
gm identify: Unable to open file (????.jpg) [Invalid argument].
gm identify: Request did not return an image.
使用IM工作:
identify 獅藝學會.jpg
ç?.è-?å-,æoƒ.jpg JPEG 3264x2448 3264x2448+0+0 8-bit sRGB 2.691MB 0.016u 0:00.004
虽然返回的文本是乱码的,但是将文件转换为.png
仍然保持与当前不同扩展名相同的文件名。
我通过使用 gm node.js库批处理我的图片发现了这个问题,调用的来源是从 UTF-8 网页进行的,所以< strong>我假设文件名作为Unicode编码传递。
我找不到与此问题相关的文档,虽然文档说明有-encoding
选项,但它无法作为参数发送到Windows上,因为它无法识别它,我无法在Google上找到相关解决方案。
请帮助,有没有简单的方法解决这个问题,同时保留确切的文件名?
答案 0 :(得分:2)
如果有人使用C api。
(您只能提供(char *
) - 类型文件名。如果在Windows上使用GraphicsMagick,则UTF-8
编码不起作用。)
您可以执行以下操作:
自己打开输入(或输出)文件(使用fopen()
,_wfopen()
等)。
然后在ImageInfo
结构中设置文件句柄以进行读取,并将Image
结构分别设置为(而不是设置文件名)。
要让GraphicsMagick生成正确的输出文件格式,请在magick
结构中设置Image
。
f.e:
//Reading
imageInfo->file=_wfopen(input_filename,L"rb"); //ImageInfo *imageInfo;
ReadImage(imageInfo,exception);
//Writing
image->file=_wfopen(output_filename,L"wb"); //Image *image;
strcpy(image->magick,"PNG");
WriteImage(imageInfo,image);
GraphicsMagick在写入/读取后自动关闭文件。
答案 1 :(得分:0)
我在C++
中使用GM时遇到同样的问题。 Windows不支持UTF-8文件名(甚至在API中也不支持!)。
我的解决方法是获取短路径名称(8.3),您可以使用command line和Win32来执行此操作。然而,这不起作用100% - 如果你想保存文件,你必须首先创建一个空文件才能获得短名称。