我想在QImage
上使用面具。
为了处理掩码,我有一个QBitmap
。现在我正在寻找一种快速的方法来做这件事:
有一种快速的方法吗?或者我是否只能使用QPainter
对象来修改QBitmap
?
问候
答案 0 :(得分:1)
您最好的选择是使用格式设置为QImage
的QImage::Format_Mono
。这样,您可以创建一个每像素1位的图像,您可以将其用作蒙版。
invertPixels
方法。bits
或scanLine
方法访问QImage
位。要使用QImage
作为掩码,您必须先将其转换为QPixmap
:
QPixmap mask = QPixmap::fromImage(img);
painter.setClipRegion(QRegion(mask));
由于QImage::Format_Mono
首先对像素MSB进行编码(意味着第一个像素将存储在第一个字节的最高有效位中),其中包含8个像素/字节,因此您需要一些比特魔法来访问正确的给定x / y位置的位:
int GetPixel(const QImage& img, const int x, const int y) const
{
const uchar mask = 0x80 >> (x % 8);
return img.scanLine(y)[x / 8] & mask ? 1 : 0;
}
void SetPixel(QImage& img, const int x, const int y, const int pixel)
{
const uchar mask = 0x80 >> (x % 8);
if (pixel)
img.scanLine(y)[x / 8] |= mask;
else
img.scanLine(y)[x / 8] &= ~mask;
}
当然,当您在同一行操作大量像素时,请不要使用像SetPixel
这样的功能,因为您不想查找scanLine(y)
对于每个像素。要有创意!