GraphicsMagick无法处理Unicode文件名

时间:2016-04-28 07:08:50

标签: node.js imagemagick graphicsmagick gm

我发现GraphicsMagick无法处理以中文命名的文件。我在ImageMagick上做了同样的测试,但IM按预期工作。

我认为这可能是一个错误,因此我在此处提交了错误报告:https://sourceforge.net/p/graphicsmagick/bugs/384/

无论如何,这是重现我的情况:

  • 平台:Win10
  • 版本:GraphicsMagick 1.3.20
  • 代码: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上找到相关解决方案。

请帮助,有没有简单的方法解决这个问题,同时保留确切的文件名?

2 个答案:

答案 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 lineWin32来执行此操作。然而,这不起作用100% - 如果你想保存文件,你必须首先创建一个空文件才能获得短名称。