ImageMaigck不支持中文路径的问题

时间:2023-03-08 17:22:14

不知道咋回事。

回顾下:

char* pTest1 = "测试.txt";
wchar_t* pTest2 = L"测试.txt";

以上是pTest1指向的内存数据是ANSI编码。一个汉字占2字节,英文符号占1字节。对应的数据是“B2 E2 CA D4 2E 74 78 74 00”  最后00是结束符'\0'的编码

pTest2指向的数据是Unicode编码,在windows上是UTF16-LE编码 。汉字和英文字符都占2字节。汉字字符编码与pTest1完全不一样,英文字符只是高8位扩展为0而已。对应的数据是:”4B 6D D5 8B 2E 00 74 00 78 00 74 00 00 00“ 最后的00 00是 ‘\0’的编码

看了下面这篇也没有解决:

http://blog.****.net/akof1314/article/details/5198537

另外,用Qt把string转换成UTF8也是错误,真是奇怪。

 QString test_path = "C:\\Users\\Yajun Dou\\Desktop\\测试.jpg";
QByteArray test_path2 = test_path.toUtf8();
const char *test_path3 = test_path2.data(); short* pDestImage = new short[*];
GetGrayPixelFormat16(test_path3, , ,pDestImage); delete pDestImage;

上面的代码也是打开文件错误,GetGrayPixelFormat16内部调用了MagickReadImage这个函数(ImageMagick的接口),这个函数返回值是false。

然后用ImageMagick自带的显示图片的软件imdisplay.exe打开中文名的图片文件也是报错误,错误指向blob.c文件,但是ImageMagick自带的convert工具却能正确的打开并转换图片。

其中在convert的源码中发现了以下代码:

 int wmain(int argc,wchar_t *argv[])
{
char
**utf8; int
status; register int
i; utf8=NTArgvToUTF8(argc,argv);
status=ConvertMain(argc,utf8);
for (i=; i < argc; i++)
utf8[i]=DestroyString(utf8[i]);
utf8=(char **) RelinquishMagickMemory(utf8);
return(status == MagickFalse ? : );
}

以上代码把agrv转成UTF-8了,那么按理来说,Qt那个函数转成UTF8也能成功啊??

再搜索下NTArgvToUTF8这个函数,在ImageMagick源码中的nt-base.c的文件中找到了。

代码如下:

 MagickExport char **NTArgvToUTF8(const int argc,wchar_t **argv)
{
char
**utf8; ssize_t
i; utf8=(char **) AcquireQuantumMemory(argc,sizeof(*utf8));
if (utf8 == (char **) NULL)
ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
for (i=; i < (ssize_t) argc; i++)
{
ssize_t
count; count=WideCharToMultiByte(CP_UTF8,,argv[i],-,NULL,,NULL,NULL);
if (count < )
count=;
utf8[i]=(char *) AcquireQuantumMemory(count+,sizeof(**utf8));
if (utf8[i] == (char *) NULL)
{
for (i--; i >= ; i--)
utf8[i]=DestroyString(utf8[i]);
utf8=(char **) RelinquishMagickMemory(utf8);
ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertStringToARGV");
}
count=WideCharToMultiByte(CP_UTF8,,argv[i],-,utf8[i],count,NULL,NULL);
utf8[i][count]=;
}
return(utf8);
}

那么,就好好研究下以上的函数吧。

研究了以上函数,我仿写了一个:

 static char *ToUTF8(wchar_t *path){

 char* utf8;
size_t count; count = WideCharToMultiByte(CP_UTF8,,path,-,NULL,,NULL,NULL); if (count < )
count=; utf8 = new char [count + ]; count = WideCharToMultiByte(CP_UTF8,,path,-,utf8,count,NULL,NULL); utf8[count] = '\0'; //putf8 = &utf8; return utf8; }

至于以上函数的用法是这样的:

        wchar_t * pPath = L"C:\\Users\\Yajun Dou\\Desktop\\测试.jpg";

     char* pTemp = ToUTF8((wchar_t*)pPath);

     MagickReadImage(pTemp...);  //ImageMagick的接口

         delete pTemp;  //注意,得delete删除ToUTF8内部分配的内存。

待我再用Qt来实现以上的功能

references:

http://blog.****.net/felomeng/article/details/9977061

http://blog.****.net/heyjimmy/article/details/1222257

http://blog.163.com/niuxiangshan@126/blog/static/170596595201282615626259/

http://blog.****.net/shenzi/article/details/4561158

http://blog.****.net/yangxiao_0203/article/details/7422660

http://blog.sina.com.cn/s/blog_76550fd701017v0x.html

http://blog.****.net/czl21/article/details/7264457

http://www.cnblogs.com/gakusei/articles/1585211.html

http://blog.****.net/xiongxiao/article/details/3741731