2014-09-22 9 views
0

Я хочу работать с масками на QImage. Чтобы обработать маску, у меня есть QBitmap. Теперь я ищу быстрый способ сделать это вещи:Как изменить пиксели QBitmap

  1. инвертировать биты маски
  2. Набор пикселей маски на новое значение

есть быстрый способ сделай это? Или я могу использовать объект QPainter для изменения QBitmap?

Приветствия

ответ

1

Лучше всего использовать QImage с форматом, установленным в QImage::Format_Mono. Таким образом вы создаете 1-битное изображение на пиксель, которое вы можете использовать в качестве маски.

  1. Для инвертирования пикселей используйте метод invertPixels.
  2. 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) для каждого пикселя. Будь креативным!

+0

спасибо. У меня тоже была эта идея. Но чем я должен каждый раз преобразовывать QImage в QBitmap, использовать его в качестве маски. Или как я могу использовать Qimage в качестве маски? (В то время я использовал метод 'setClipRegion()' 'QPainter' для настройки маски) –

+1

Проблема в том, что' setMask' также является дорогостоящей операцией, потому что 'QBitmap' все еще необходимо преобразовать в зависимую от устройства 'QPixmap'. Возможно, вам лучше обновить маску 'QPixmap', когда маска изменилась (если вы не измените ее для каждой краски). Возможно, вы можете использовать один из режимов ['Composition Modes'] (http://qt-project.org/doc/qt-5/qpainter.html#composition-modes) художника (похоже, он не работает для OpenGL художник, хотя) –

+0

«Режим композиции» помогает мне. В настоящее время я использую метод 'setPixel'' QImage', но я думаю, что если я хочу изменить большое количество пикселей, бит-операция будет быстрее. Проблема в том, что 'bits()' возвращает только указатель с 'uchar'. Можете ли вы сказать мне, как установить значение пикселя x? –

 Смежные вопросы

  • Нет связанных вопросов^_^