QImage(uchar * data)如何格式化数组?

时间:2015-09-17 09:33:22

标签: arrays image qt format qimage

有人能告诉我如何格式化我的数组,以便将其加载到QImage中吗? 现在我有一个2d-char数组:

uchar dataArray[400][400];
time_t t;
srand(time(&t));
int x, y;
for(x=0; x< 400; x++)
{
    for(y=0; y<400; y++)
    {
        dataArray[x][y] = rand()%1001;
    }
}
QPainter MyPainter(this);
scene = new QGraphicsScene(this);
scene->addEllipse(200, 200, 20, 20);
ui.graphicsView->setScene(scene);
*image = new QImage(*dataArray, 400, 400, QImage::Format_Mono);
image->setColorCount(2);
image->setColor(1, qRgb(255, 0, 0));//red
image->setColor(0, Qt::transparent);
scene->addPixmap(QPixmap::fromImage(*image));

当数组的内容为0时,我想要一种颜色和内容&gt; 0另一种颜色。所以我想将数组加载到单色QImage中。显然这个数组不起作用。如何为我的QImage正确加载格式化数组? 该文件只是说跟随,但我真的没有得到这意味着......

  

数据必须是32位对齐的,并且图像中每个数据扫描线也必须是32位对齐的。

我想要一个像Format_Mono这样的QImage,其中&#34; x&#34;和&#34; +&#34;表示具有不同颜色(红色和透明)的单个像素:

xxxx+xxx++xxx
xxx++xx++xxxx
++x+x+xxxxxxx
+xxx+x+x+x+xx

为此,我有一个数组(上面的代码中的dataArray)具有相同的模式,其中x高于指定值,+低于或等于(此时值为0)。 如何将此数组转换为QImage可以与Format_Mono一起使用的数组,以便我可以看到正确的模式?

2 个答案:

答案 0 :(得分:0)

假设dataArray被声明为uchar dataArray[400][400];

QImage tmpImg(dataArray[0], 400, 400, QImage::Format_Grayscale8);
// this image shares memory with dataArray and this is not safe 
// for inexperienced developer

QImage result(tmpImg); // shallow copy
result.bits(); // enforce a deep copy of image

答案 1 :(得分:0)

找到将我的dataArray转换为工作imageArray的解决方案:

一旦你弄清楚它是如何完成的,它就很容易了(显然我应该知道为什么我不能把它放在第一位......)。我只需要逐位转换每个数据点到新数组,我也必须弄清楚,imageArray的轴必须是[y] [x] - 顺序而不是相反的方式(谁是他会按照这个顺序做到这一点吗?!)。

很多时候浪费了这一点......

uchar dataArray[400][400]; //first index is x-axis, second one is y-axis
uchar imageArray[400][52]; //first index is y-axis, second one is x-axis 
time_t t;
srand(time(&t));
int x, y;
for(y=0; y<400; y++)
{
    for(x=0; x<400; x++)
    {
        dataArray[x][y] = rand()%1001;
    }
}
for(y=0; y<400; y++)
{
    for(x=0; x<400; x++)
    {
        if(dataArray[x][y] > 0)
            imageArray[y][x/8] |= 1 << 7-x%8; //changing bit to 1
            //7- because msb is left but we start counting left starting with 0
        else
            imageArray[y][x/8] &= ~(1 << 7-x%8); //changing bit to 0
    }
}
scene = new QGraphicsScene(this);
ui.graphicsView->setScene(scene);
QImage *image = new QImage(*imageArray, 400, 400, QImage::Format_Mono);