QT QImage манипуляция пикселями
Я создаю приложение QT GUI и использую QImage для открытия изображений.
Моя проблема в том, что я не могу понять, как использовать QImage bit() и scanline()
методы для получения доступа на уровне пикселей.
Я видел этот пост Проблемы с манипуляцией пикселями Qt QImage
но это только для первого пикселя каждой строки. Это правильно, или я все понял неправильно?
заблаговременно
Ответы
Ответ 1
scanlines
соответствуют высоте изображения, столбцы соответствуют ширине изображения.
В соответствии с документами прототип выглядит как uchar* QImage::scanline(int i)
или аналогичная версия const
.
Но, как отметил комментатор, поскольку данные зависят от архитектуры и образа машины, вы должны НЕ использовать uchar *
напрямую. Вместо этого используйте что-то вроде следующего:
QRgb *rowData = (QRgb*)img.scanLine(row);
QRgb pixelData = rowData[col];
int red = qRed(pixelData);
Ответ 2
Это может быть не сразу видно из сообщения Kaleb, но следующее работает для установки пикселя на изображение 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));
Ответ 3
Ответ не помог мне. Похоже, данные не совпадают с 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);
}
}