QT QImage пиксельная манипуляция - PullRequest
13 голосов
/ 19 января 2010

Я создаю приложение QT GUI и использую QImage для открытия изображений. Моя проблема в том, что я не могу понять, как использовать QImage bit () и Scanline () методы для получения доступа на уровне пикселей.

я видел этот пост Qt QImage проблемы с пикселями но это только для первого пикселя каждой строки. Это правильно или я все неправильно поняла?

заранее спасибо

Ответы [ 3 ]

14 голосов
/ 19 января 2010

scanlines соответствуют высоте изображения, столбцы соответствуют ширине изображения.

Согласно документам, прототип выглядит как uchar* QImage::scanline(int i),или аналогичная const версия.

Но, как отметил комментатор, поскольку данные зависят от архитектуры и образа машины, вы должны НЕ напрямую использовать uchar *.Вместо этого используйте что-то вроде следующего:

QRgb *rowData = (QRgb*)img.scanLine(row);
QRgb pixelData = rowData[col];
int red = qRed(pixelData);
13 голосов
/ 24 мая 2011

Это может быть не сразу очевидно из поста Калеба, но следующее работает для установки пикселя на изображение Format_RGB32.

// Get the line we want
QRgb *line = (QRgb *)image->scanLine(row_index);

// Go to the pixel we want
line += col_index;

// Actually set the pixel
*line = qRgb(qRed(color), qGreen(color), qBlue(color));
0 голосов
/ 03 декабря 2016

Ответ у меня не сработал. Похоже, данные не выровнены по 32-битной системе в моей системе. Чтобы получить правильные данные, в моей системе я должен был сделать это:

for(uint32_t Y = 0; Y < mHeight; ++Y)
{
    uint8_t* pPixel = Image.scanLine(Y);

    for(uint32_t X = 0; X < mWidth; ++X)
    {
      const int Blue = *pPixel++;
      const int Green = *pPixel++;
      const int Red = *pPixel++;

      uint8_t GrayscalePixel = (0.21f * Red) + (0.72f * Green) + (0.07 * Blue);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...