Получить необработанные данные из QImage - PullRequest
4 голосов
/ 28 апреля 2011

У меня есть QImage, который я построил из растрового изображения примерно так:

QPixmap fullPmap = topItem->pixmap();
fullPmap = fullPmap.copy(isec.toRect());
QImage chip = fullPmap.toImage();

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

Теперь мне нужно получить массив символов, представляющих эти данные, из чипа.

Как я могу это сделать?

Я пробовал что-то вроде этого:

  unsigned char * data = chip.bits();

И когда я отображаю «данные», я получаю полностью искаженное изображение, не похожее на мой настоящий чип.

fullPmap - это изображение RGB, если это имеет значение. У меня есть код, который я использую для преобразования его в оттенки серого:

QRgb col;
int gray;
for (int i = 0; i < chip.width(); ++i)
{
    for (int j = 0; j < chip.height(); ++j)
    {
        col = chip.pixel(i, j);
        gray = qGray(col);
        chip.setPixel(i, j, qRgb(gray, gray, gray));
    }
}

Что мне не очень нравится, но мне показалось, что это самый простой способ сделать это.

Отображение данных, возвращаемых из битов (), выглядит следующим образом:

imwidth = chip.width();
imheight = chip.height();
QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
//  #pragma omp parallel for
for (int i = 0 ; i < imheight ; i++)
    for (int j = 0 ; j < imwidth ; j++)
    {
        qi->setPixel(j,i,qRgb(data[i*imwidth + j],data[i*imwidth + j],data[i*imwidth + j]));
    }

Ответы [ 2 ]

9 голосов
/ 28 апреля 2011

При работе с необработанными данными изображения вам необходимо знать о некоторых основных проблемах:

  • Каков формат или расположение данных пикселей.QImage, преобразованный из QPixmap, не обязательно всегда находится в RGB888 или RGB32.Вызовите QImage :: format () и по-разному работайте с другим макетом.Особенно в семействе RGB32 вам необходимо убедиться, что вы обращаетесь к ним в правильном порядке байтов (порядковый номер).

  • Байты не всегда располагаются точно так, как много байтов содержит пиксели строки,Обычно строка будет иметь больше байтов, чем необходимо.Используйте QImage :: bytesPerLine (), чтобы узнать и продвинуть указатель на столько байтов при переходе к следующей строке.Это, вероятно, ваша проблема в создании отображаемого изображения.

  • QImage :: pixel () и setPixel () действительно медленные.Получить / установить значения пикселей из буфера необработанных пикселей, если это возможно.

0 голосов
/ 28 апреля 2011

Это сработало для меня:

m_image =  new QImage(IMAGE_WIDTH,IMAGE_HEIGHT, QImage::Format_RGB32);
m_image->fill(Qt::white);
int rawDataCount = 0;
for (int y = 0;y<IMAGE_HEIGHT;y++)
{
    uint* line = (uint*)m_image->scanLine(y);
    for (int x=0;x<IMAGE_WIDTH;x++)
    {
        WORD temp = cameraZero[rawDataCount++];
        BYTE value = temp >> 2;
        QColor grey(value,value,value); 
        line[x] = qRgba(value,value,value,100);
    }
}

, где cameraZero содержит список значений пикселей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...