如何修改QBitmap的像素

时间:2014-09-22 13:14:26

标签: qt mask qimage qpixmap

我想在QImage上使用面具。 为了处理掩码,我有一个QBitmap。现在我正在寻找一种快速的方法来做这件事:

  1. 反转面具的位
  2. 将蒙版的像素设置为新值
  3. 有一种快速的方法吗?或者我是否只能使用QPainter对象来修改QBitmap

    问候

1 个答案:

答案 0 :(得分:1)

您最好的选择是使用格式设置为QImageQImage::Format_Mono。这样,您可以创建一个每像素1位的图像,您可以将其用作蒙版。

  1. 要反转像素,请使用invertPixels方法。
  2. 可以使用bitsscanLine方法访问
  3. QImage位。
  4. 要使用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)对于每个像素。要有创意!