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也是错误,真是奇怪。
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.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
ImageMaigck不支持中文路径的问题的更多相关文章
- 浅析GDAL库C#版本支持中文路径问题
GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...
- svn不支持中文路径问题的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 svn的授权文件authz默认是不支持中文路径的,因此在精确控制中文文件夹的授权时往往会出错.要解决这个问题,需要用U ...
- GDAL支持中文路径和Shp文件中文属性写入
在使用GDAL的过程中,为了支持中文,比需手动进行中文路径的设置,同时特别是在对Shp的属性进行中文输入的时候,都必须进行必要的设定. 为了支持中文路径,在注册了驱动之后,加上第三句就可以了.必须设置 ...
- 使GDAL库支持中文路径或中文文件名的处理方法
之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图: 解决方法: 1. 在所有使用GDALAllRegist ...
- 解决tomcat不支持中文路径的问题
问题描述: 开发文件下载功能时,因为需求比较简单,要求下载一个说明文件.于是,直接给出了文件所在服务器的地址,通过链接直接下载此文件(因需求简单,未考虑安全方面的问题-_-||). 在这个过程中,文件 ...
- 【转】让apache支持中文路径或者中文文件
本帖最后由 狂人阿川 于 2013-4-12 19:13 编辑 今天在给一美国VPS客户调试他的程序的时候.发现他的网站有中文名称.貌似apache无法认识中文路径,火狐下面能下载他的文件,IE下面不 ...
- 浅析GDAL库C#版本支持中文路径问题(续)
上篇博客中主要说了GDAL库C#版本中存在的问题,其表现形式主要是:"文件名中的汉字个数是偶数,完全没有影响,读取和创建都正常,如果文件名中的汉字个数是奇数,读取和创建都会报错." ...
- Jenkins的FTP上传插件Publish Over FTP Plugin设置支持中文路径
[系统管理]->[系统设置]->[Publish over FTP]->[Control encoding]->输入[GB2312]或者[UTF-8]
- gdal中文路径无法打开问题
在C#中使用OGR读写矢量数据时,需要引用“using OSGeo.OGR;”. 同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下: //为了支持中文路径,请添加下面这句代码(大多 ...
随机推荐
- CentOs6.5中安装和配置vsftp简明
这篇文章主要介绍了CentOs6.5中安装和配置vsftp简明教程,需要的朋友可以参考下 一.vsftp安装篇 复制代码代码如下: # 安装vsftpdyum -y install vsftp ...
- Oracle优化笔记
2016-11-22 子查询:标量子查询 内联视图(in-line view) 半连接/反连接 标量子查询 select 后跟子查询 类似自定义函数 可用开窗函数之类的改写 内联视图(in ...
- hdu2082:简单母函数
题目大意: a,b,c,d...z这些字母的价值是1,2,3......26 给定 这26个字母分别的数量,求总价值不超过50的单词的数量 分析: 标准做法是构造母函数 把某个单词看作是,关于x的多项 ...
- mysql 从data文件恢复数据库
安装在D:\mysql\mysql-5.6.24-winx64下的mysql 由于系统坏了,移到另外一台机器上启动 步骤如下 1.复制以前的mysql安装文件及data文件下:2.全新安装mysql3 ...
- wex5添加视频播放
我使用的播放器是ckplayer http://www.ckplayer.com/ ckplayer存放路,项目路径下: 方法一: 在monitor.w里加一个div标签 <div id=&qu ...
- Java IO :文件
在java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这里只提供一些必要的知识点. 通过Java IO读文件 如果你需要在不同端之间读 ...
- http接口测试浏览器插件
http接口测试浏览器插件: Chrome: https://chrome.google.com/webstore/detail/chrome-poster/cdjfedloinmbppobahmon ...
- IPMI 配置BMC用户设置
IPMI 配置BMC用户设置 本文档共介绍5条ipmi设置user的命令,这些命令需要使用root权限才能使用,其中- H为需要操作的BMC ip,-I lanplus为使用rmcp+协议发送命令,- ...
- python - 类成员修饰符
在java,c#类的成员修饰符包括,公有.私有.程序集可用的.受保护的. 对于python来说,只有两个成员修饰符:公有成员,私有成员 成员修饰符是来修饰谁呢?当然是修饰成员了.那么python类的成 ...
- Fragment 点击事件的穿透和重叠bug
从A fragment跳转到B fragment ,为了返回时不从新加载A fragment内容,通常使用add方法来将a添加到后退栈. 在B Fragment 中点击一个空白区域,如果A Fragm ...