Qt 使用QString存储图片数据 unsigned char* 格式

最近工作上刚好要用到QString来存储图片,其实刚听到这种做法的时候觉得很不靠谱,因为通过编码以后,数据很容易变形,一开始很愚蠢的用了utf-8,当然是失败了。不过百度一番以后,发现可以巧妙的使用base64来存储。

首先将读取到的图片数据(char* 格式的,如果是 unsigned char* 的话就将它强转为char*)转为QPixmap:

QByteArray byte_array;
QImage img;
img.loadFromData((char*数据), 40960);
QDataStream data_stream(&byte_array,QIODevice::WriteOnly);
data_stream << QPixmap::fromImage(img);
QString picStr = QString::fromLocal8Bit(byte_array.toBase64());

看到这,应该都会有个疑问,为什么要先将图片数据(char*格式)先转为QImage后再转为QPixmap,不能直接将char*转为QByteArray,然后直接转成base64吗?还真不能,具体原因没有去细究,不过我试过将char*直接转为QByteArray后再转为base64,最后转为QString,结果是用这样生成的QString转不回原来的图片数据。

 

接下来将上面生成的QString转为QPixmap来显示:

QByteArray byte_array1 = QByteArray::fromBase64( picStr.toLocal8Bit() );
QPixmap pix;
QDataStream data_stream1(&byte_array1,QIODevice::ReadOnly);
data_stream1>>pix;
label->setPixmap(pix);

这个就比较简单了,将QString直接用 toLocal8Bit() 转为 QByteArray,然后反base64即可。

其实在在请求服务器的文件时,我们也经常将文件以base64的格式来传输。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用 QString::fromLocal8Bit() 函数可以将 unsigned char* 转为 QString。例如: ``` unsigned char* char_ptr = ...; QString str = QString::fromLocal8Bit(reinterpret_cast<const char*>(char_ptr)); ``` ### 回答2: 在C++中,unsigned char* 是一个指向无符号字符类型的指针。而QStringQt中用来表示Unicode字符串的类,它提供了方便的Unicode字符串操作方法。 要将unsigned char*转换为QString,我们可以使用QString的构造函数或者使用QString的静态方法fromUtf8()。 使用构造函数方式: ``` const unsigned char* data = ...; // 指向unsigned char数据的指针 int size = ...; // 数据大小 QString str = QString::fromUtf8(reinterpret_cast<const char*>(data), size); ``` 在这个例子中,我们先定义了data指向unsigned char的指针,以及size数据大小。然后使用QString的fromUtf8()静态方法将data转换为QString,reinterpret_cast<const char*>是将unsigned char*转换为const char*的类型转换。最终得到的str就是我们想要的QString使用静态方法fromUtf8()方式: ``` const unsigned char* data = ...; // 指向unsigned char数据的指针 int size = ...; // 数据大小 QString str = QString::fromUtf8(reinterpret_cast<const char*>(data), size); ``` 在这个例子中,我们也是先定义了data指向unsigned char的指针,以及size数据大小。然后使用QString的静态方法fromUtf8()将data转换为QString。当然,reinterpret_cast<const char*>这个类型转换同样需要加上。 需要注意的是,当unsigned char*指向的数据不是UTF-8编码时,我们需要使用其他的QString构造函数或静态方法进行转换,例如fromLatin1(),fromLocal8Bit()等。 综上所述,我们可以根据需要使用QString的构造函数或静态方法从unsigned char*转换为QString,但需要注意数据的编码方式。 ### 回答3: 在使用Qt框架开发过程中,我们可能遇到将unsigned char*类型转换为QString类型的需求。本文将介绍两种方法实现这一转换。 方法一:手动转换 可以使用QString构造函数将unsigned char*转换为QString类型。我们首先需要将unsigned char*转换为char*类型,然后再使用char*构造函数将其转换为QString类型。 示例代码如下: ```cpp //声明unsigned char*指针 unsigned char* str = new unsigned char[100]; //给指针赋值 strcpy((char*)str,"Hello world"); //将unsigned char*转为char* char* cstr = (char*)str; //将char*转为QString QString qstr = QString::fromLatin1(cstr); ``` 此处需要注意,字符串转换时需根据原始字符串编码格式选择适当的转换方式。上述代码使用了fromLatin1方法来转换,因为默认情况下Qt使用该编码格式。 方法二:使用QByteArray 另一种转换方式是使用QByteArray类。QByteArray可用于存储原始字节数据,并提供了许多转换方法。我们可以将unsigned char*转换为QByteArray,再使用QByteArray构造函数将其转换为QString类型。 示例代码如下: ```cpp //声明unsigned char*指针 unsigned char* str = new unsigned char[100]; //给指针赋值 strcpy((char*)str,"Hello world"); //将unsigned char*转为QByteArray QByteArray ba((const char*)str); //将QByteArray转为QString QString qstr = QString(ba); ``` 这种方式不需要手动指定字符串编码格式,因为QByteArray类会自动处理编码格式。 总结: 本文介绍了两种将unsigned char*转换为QString的方法,其中第一种方法需要手动指定字符串编码格式,而第二种方法则由QByteArray类自动处理。使用二者各有优缺点,需要在具体情况下进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值