ImageMaigck不支持中文路径的问题

 

不知道咋回事。

 

回顾下:

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.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] = '\0';

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

你可能感兴趣的:(image)