QImage(uchar *data) 如何格式化数组?
Posted
技术标签:
【中文标题】QImage(uchar *data) 如何格式化数组?【英文标题】:QImage(uchar *data) how to format array? 【发布时间】:2015-09-17 09:33:22 【问题描述】:谁能告诉我如何格式化我的数组以便将其加载到 QImage 中? 现在我有一个二维字符数组:
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 时,我想要一种颜色并且内容 > 0 另一种颜色。所以我想将数组加载到单色 QImage 中。显然这个数组不起作用。数组需要如何格式化才能让我的 QImage 正确加载? 文档只是说以下,但我真的不明白这意味着什么......
数据必须是 32 位对齐的,图像中数据的每条扫描线也必须是 32 位对齐的。
我想要一个像这样的带有 Format_Mono 的 QImage 其中“x”和“+”代表具有不同颜色(红色和透明)的单个像素:
xxxx+xxx++xxx
xxx++xx++xxxx
++x+x+xxxxxxx
+xxx+x+x+x+xx
为此,我有一个具有相同模式的数组(dataArray,如上面的代码),其中 x 高于指定值,+ 低于或等于(此时值为 0)。 如何将此数组转换为 QImage 可以使用 Format_Mono 的数组,以便我可以看到正确的模式?
【问题讨论】:
数据不足。dataArray
的类型是什么?
是uchar。但我知道数组不会像我实现的那样工作。
【参考方案1】:
假设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
【讨论】:
这不起作用。我格式化数组的方式应该在整个图像中显示大约 1600 个随机像素。但是按照我实现数组的方式使用它,它会在整个图像中显示更多的随机像素(50%)。我不认为我的问题是如何将数组传递给 QImage,而是我如何首先格式化数组。 所以提供更多代码来显示你做错了什么。 我添加了更多代码,但错误一定是我如何填充数组,因为我根本不知道 QImage 需要什么格式。我还添加了一些文字,希望您现在能更好地理解我的问题。【参考方案2】:找到将我的 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);
【讨论】:
"imageArray 的轴必须是 [y][x] 的顺序,而不是相反的顺序(谁他妈会按这个顺序做呢?!” ...读取图像数据?每个人,因为渐进式图像几乎*总是逐行/逐行读取。处理图像数据的技巧是忘记 'x' 和 'y',因为它们只是混淆了问题,而是只考虑 'h' 和 'w'。* - (我相信有人会想出一个反例,如果我说总是-总是。)以上是关于QImage(uchar *data) 如何格式化数组?的主要内容,如果未能解决你的问题,请参考以下文章