ImageMaigck不支持中文路径的问题

不知道咋回事。

回顾下:

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

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

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是 ‘’的编码

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

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

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

1 QString test_path = "C:\Users\Yajun Dou\Desktop\测试.jpg";
2 QByteArray test_path2 = test_path.toUtf8();
3 const char *test_path3 = test_path2.data();
4 
5 short* pDestImage = new short[1024*768];
6 GetGrayPixelFormat16(test_path3, 1024, 768,pDestImage);
7 
8 delete pDestImage;

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

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

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

 1 int wmain(int argc,wchar_t *argv[])
 2 {
 3   char
 4     **utf8;
 5 
 6   int
 7     status;
 8 
 9   register int
10     i;
11 
12   utf8=NTArgvToUTF8(argc,argv);
13   status=ConvertMain(argc,utf8);
14   for (i=0; i < argc; i++)
15     utf8[i]=DestroyString(utf8[i]);
16   utf8=(char **) RelinquishMagickMemory(utf8);
17   return(status == MagickFalse ? 0 : 1);
18 }

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

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

代码如下:

 1 MagickExport char **NTArgvToUTF8(const int argc,wchar_t **argv)
 2 {
 3   char
 4     **utf8;
 5 
 6   ssize_t
 7     i;
 8 
 9   utf8=(char **) AcquireQuantumMemory(argc,sizeof(*utf8));
10   if (utf8 == (char **) NULL)
11     ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
12   for (i=0; i < (ssize_t) argc; i++)
13   {
14     ssize_t
15       count;
16 
17     count=WideCharToMultiByte(CP_UTF8,0,argv[i],-1,NULL,0,NULL,NULL);
18     if (count < 0)
19       count=0;
20     utf8[i]=(char *) AcquireQuantumMemory(count+1,sizeof(**utf8));
21     if (utf8[i] == (char *) NULL)
22       {
23         for (i--; i >= 0; i--)
24           utf8[i]=DestroyString(utf8[i]);
25         utf8=(char **) RelinquishMagickMemory(utf8);
26         ThrowFatalException(ResourceLimitFatalError,
27           "UnableToConvertStringToARGV");
28       }
29     count=WideCharToMultiByte(CP_UTF8,0,argv[i],-1,utf8[i],count,NULL,NULL);
30     utf8[i][count]=0;
31   }
32   return(utf8);
33 }

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

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

 1 static char *ToUTF8(wchar_t *path){
 2 
 3 char* utf8;
 4 size_t count;
 5 
 6 
 7 count = WideCharToMultiByte(CP_UTF8,0,path,-1,NULL,0,NULL,NULL);
 8 
 9 if (count < 0)
10 count=0;
11 
12 utf8 = new char [count + 1];
13 
14 count = WideCharToMultiByte(CP_UTF8,0,path,-1,utf8,count,NULL,NULL);
15 
16 utf8[count] = '';
17 
18 //putf8 = &utf8;
19 
20 return utf8;
21 
22 }

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

1        wchar_t * pPath = L"C:\Users\Yajun Dou\Desktop\测试.jpg";
2     
3     
4     char* pTemp = ToUTF8((wchar_t*)pPath);
5 
6     MagickReadImage(pTemp...);  //ImageMagick的接口
7 
8         delete pTemp;  //注意,得delete删除ToUTF8内部分配的内存。

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

references:

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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/foohack/p/3945631.html