• 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

  • 相关阅读:
    CefSharp 屏蔽右键菜单
    CEfSharp下载文件 弹出保存框,实现 IDownloadHandler 接口
    C#使用Xamarin开发移动应用 ---- 系列文章
    浅析 fstab 与移动硬盘挂载方法
    树莓派设置固定IP地址
    win10 任务栏上的工具栏,重启消失的解决方法
    《丽人行》
    Chrome调试 ---- 控制台获取元素上绑定的事件信息以及监控事件
    Bootstrap基础学习 ---- 系列文章
    C#进阶系列 ---- 《CLR via C#》
  • 原文地址:https://www.cnblogs.com/foohack/p/3945631.html
Copyright © 2020-2023  润新知