2

我发现 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网页进行的,所以我假设文件名作为 Unicode encoding 传递

我没有找到与此问题相关的文档,虽然文档说明有一个-encoding选项,但它无法在 Windows 上作为参数发送,因为它无法识别它,我在 Google 上找不到相关解决方案。

请帮忙,有什么简单的方法可以解决这个问题,同时保持准确的文件名?

4

2 回答 2

2

如果有人使用 C api。(您只能提供 ( char *) 类型的文件名。UTF-8如果在 Windows 上使用 GraphicsMagick,编码将不起作用。)

您可以执行以下操作:

自己打开文件进行输入(或输出)(使用fopen()_wfopen())。

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

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

费:

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

于 2017-11-22T12:45:21.873 回答
0

我在使用 GM 时遇到了同样的问题C++。Windows 下不支持 UTF-8 文件名(甚至在 API 中也不支持!)。

我的解决方法是获取短路径名(8.3),您可以使用命令行Win32来做到这一点。但是,这不能 100% 起作用 - 如果您想保存一个文件,您必须先创建一个空文件才能获得短名称。

于 2016-07-25T09:15:19.930 回答