Qt 显示灰度Unpacked 10 raw图
Qt显示raw图
在Qt中无法直接显示raw图,需要先将raw图以二进制读取,再对QImage每个像素进行赋值操作
读取raw图(提前知晓raw图的宽高)
以二进制形式读取raw图,这里读取到vector中存储;由于是Unpacked 10类型,占10位,所以使用quint16占16位的类型来存储
- 如果是8位的raw图则使用
quint8或其他8位的类型存储
std::vector<quint16> rawData;
size_t dataSize = width * height * sizeof(quint16);;
std::ifstream ifs(filePath.toStdString());
if(!ifs.is_open()){
qDebug() << filePath << " cant open";
return;
}
ifs.seekg(0, std::ios::end);
size_t actual_size = ifs.tellg();
ifs.seekg(0, std::ios::beg);
// 匹配文件大小 防止宽高错误
if (actual_size != dataSize) {
std::cerr << "文件大小不匹配!" << std::endl;
return;
}
// 读取数据到缓冲区
rawData.resize(width * height);
ifs.read(reinterpret_cast<char*>(rawData.data()), actual_size);
ifs.close();
创建QImage
以灰度8位QImage::Format_Grayscale8的形式创建QImage,并对每个像素点单独赋值
- 注意:Unpacked 10是10位范围是
0~1024而8位是0~255,需要进行右移操作使其范围控制在0~255以内
QImage image(width, height, QImage::Format_Grayscale8);
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
// QImage::Format_Grayscale8的范围是0~255
// 需要对0~1024像素值进行缩放映射到0~255对应范围中
quint8 pixel = rawData[y * width + x] >> 2;
// 设置像素值
// 使用 qRgb 函数将灰度值转换为 QRgb 类型
QRgb gray = qRgb(pixel, pixel, pixel);
image.setPixel(x, y, gray);
}
}
显示raw图
创建一个label组件,设置其Pixmap属性,并调用QPixmap::fromImage将QImage转为QPixmap即可完成图片的显示
// 显示图片
ui->label->setPixmap(QPixmap::fromImage(image));

浙公网安备 33010602011771号