Лучше всего использовать QImage
с форматом, установленным в QImage::Format_Mono
. Таким образом вы создаете 1-битное изображение на пиксель, которое вы можете использовать в качестве маски.
- Для инвертирования пикселей используйте метод
invertPixels
.
QImage
биты могут быть доступны с использованием методов bits
или scanLine
.
Чтобы использовать QImage
в качестве маски, вы должны преобразовать его к QPixmap
первым:
Поскольку QImage::Format_Mono
кодирует пиксели MSB первый (означает первый пиксель будет храниться в наиболее значимых бит первого байта) с 8 точек/байт, вам понадобится битовую магию, чтобы получить доступ к правильной бит для данного х/у позиции:
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;
}
конечно, не следует использовать функцию Li ke SetPixel
, когда вы манипулируете множеством пикселей в одной строке, так как вы не хотите искать scanLine(y)
для каждого пикселя. Будь креативным!
спасибо. У меня тоже была эта идея. Но чем я должен каждый раз преобразовывать QImage в QBitmap, использовать его в качестве маски. Или как я могу использовать Qimage в качестве маски? (В то время я использовал метод 'setClipRegion()' 'QPainter' для настройки маски) –
Проблема в том, что' setMask' также является дорогостоящей операцией, потому что 'QBitmap' все еще необходимо преобразовать в зависимую от устройства 'QPixmap'. Возможно, вам лучше обновить маску 'QPixmap', когда маска изменилась (если вы не измените ее для каждой краски). Возможно, вы можете использовать один из режимов ['Composition Modes'] (http://qt-project.org/doc/qt-5/qpainter.html#composition-modes) художника (похоже, он не работает для OpenGL художник, хотя) –
«Режим композиции» помогает мне. В настоящее время я использую метод 'setPixel'' QImage', но я думаю, что если я хочу изменить большое количество пикселей, бит-операция будет быстрее. Проблема в том, что 'bits()' возвращает только указатель с 'uchar'. Можете ли вы сказать мне, как установить значение пикселя x? –