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::fromImageQImage转为QPixmap即可完成图片的显示

    // 显示图片
    ui->label->setPixmap(QPixmap::fromImage(image));
posted @ 2025-02-24 10:37  风陵南  阅读(108)  评论(0)    收藏  举报