GraphicsMagick无法处理Unicode文件名

我发现GraphicsMagick无法处理我的中文文件。 我在ImageMagick上做了同样的testing,但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网页,所以我假设文件名是作为Unicode编码传递

我发现没有任何与此问题有关的文档,虽然文档指出有一个-encoding选项,它不能在Windows上作为参数发送,因为它不能识别它,我无法在Google上find相关的解决scheme。

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

如果有人使用C API。 (你只能给( char * )types的文件名。如果在Windows上使用GraphicsMagick, UTF-8编码不起作用。)

你可以做到以下几点:

打开文件input(或输出)自己(使用fopen()_wfopen()等)。

然后分别在ImageInfo结构中设置文件句柄来读取和写入Image结构(而不​​是设置文件名)。

要让GraphicsMagick生成正确的输出文件格式,请在Image结构中设置magick

FE:

 //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在写入/读取后自动closures文件。

我在C++使用GM有同样的问题。 在Windows下不支持UTF-8文件名(即使在API中也不支持)。

我的解决方法是获取短path名(8.3),您可以使用命令行和Win32 。 然而,这不能100%的工作 – 如果你想保存一个文件,你必须首先创build一个空的名称才能获得短名称。