从 QBytearray 创建 QImage

Posted

技术标签:

【中文标题】从 QBytearray 创建 QImage【英文标题】:Creating a QImage from QBytearray 【发布时间】:2014-03-12 21:52:06 【问题描述】:

我正在尝试从二进制文件中保存为 16 位整数的数据构造 QImages。我可以很好地加载数据,但是当我使用 QImage::loadFromData(QBytearray ba) 函数(返回 false)时我的程序失败,如下所示:

QBytearray frame;
QImage pic = QImage(256, 256, QImage::Format_RGB888);

for(int i = 0; i < height; i++) 
    for(int j = 0; j < width; j++) 
        // Access value of pixel at each location
        datum = store[i][j];

        for(int c = 0; c < 3; c++) 
            // Calculate colour at given pixel
            col = (255.0f * ((float)datum - (float)min) / ((float)(max - min)));
            // Assign colour value to the pixel
            frame[c+3*j+3*i*width] = ((unsigned char)col);
        
    


pic.loadFromData(frame);

我从之前编写的 Java 代码中重新调整了它的用途,该代码完全按预期工作(来自完全相同的数据):

BufferedImage image = = new BufferedImage(256, 256, BufferedImage.TYPE_3BYTE_BGR);

byte[] data = image.getRaster().getDataBuffer();

for (j=0; j<height; j++) 
    for (i=0; i<width; i++) 
        //Find value of the pixels at the location
        datum=data[j][i];
        for (c=0; c<3; c++) 
            //Calculate the colour at the given pixel
            col=(255.0f*((float)datum-(float)min)/((float)(max-min)));
            //Assign the colour value to the pixel
            data[c+3*i+3*j*width] = (byte)col;
         
    

谁能帮我看看我哪里出错了?我已经被难住了好几天,完全没有想法。

【问题讨论】:

您是否尝试过将store 设置为一组硬编码的预定值?如果有,结果如何?如果没有,你能做到这一点并给我们结果吗?完成构建后frame 是什么? @MirroredFate 考虑到图像是 256x256,我无法真正做到这一点,因此硬编码该图像的值有点费时。当我完成构建时,frame 到底是什么意思?尺寸? 虽然让我感到困惑的一件事是,从直接从文件加载的单独图像中转储 Bytearray(效果很好)给了我一个 QByteArray 2562 个元素长 - 而我正在构建的是196609 个元素长。我觉得这种(巨大的)大小差异至少是问题的一部分,但我不知道两者之间的数据格式差异可能是什么。我的意思是,196609 字节数组在 Java 实现中工作得很好,所以我真的不知道为什么相同大小的图像的 C++ 字节数组会小得多。 此外,在 QImage::loadFromData(QByteArray ba) 函数中使用转储的 QByteArray 的工作方式与宣传的完全一样。似乎大小差异是主要问题,但即使我放弃颜色设置(c for 循环)我仍然有一个 65536 个元素长的数组。 这主要是猜测你有一个二维数组store和一个QByteArray框架。您正在将无符号字符(1 个字节)从 store 移动到 frame,但您的 RGB 值总共需要 3 个字节。这意味着frame 本质上是一个等于 256*256*3 或 196609 字节的字节数组。我看不到你在哪里输入标题信息来告诉它是哪种图像,或者任何类型的元字符来给出大小...... 【参考方案1】:

好的,假设您实际上是在尝试为单个像素设置 RGB 值,在阅读 QImage details 之后,我看到您可以使用以下方法:

value = qRgb(189, 149, 39); // 0xffbd9527
image.setPixel(1, 1, value);

所以,类似:

QImage pic = QImage(256, 256, QImage::Format_RGB888);
QRgb value;
int r,b,g;

for(int i = 0; i < height; i++) 
    for(int j = 0; j < width; j++) 
        // Access value of pixel at each location
        datum = store[i][j];
        //I get really confused what is going on here... you don't seem to be actually using `c` for the calculation?
        for(int c = 0; c < 3; c++)  //let's just pretend you set the ints r,b,g in here somewhere
            // Calculate colour at given pixel
            col = (255.0f * ((float)datum - (float)min) / ((float)(max - min)));
        
        // Assign colour value to the pixel
        value = qRgb(r, g, b);
        pic.setPixel(i, j, value);
    

【讨论】:

效果非常好,非常感谢,这几天让我很恼火。你不知道我是多么高兴终于找到了解决方案。

以上是关于从 QBytearray 创建 QImage的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据库文件中创建 QByteArray

如何从 QByteArray 获取结构

从 QByteArray 解析 QT5 JSON

从 QByteArray 以 bigendian 格式获取浮点数组的有效方法

从作为 QString 输入的 HEX 值构造 QByteArray

从QDataStream向QByteArray中写入数据时的注意点(QT)