Отображение и определение размеров шкалы серого из QImage в Qt - PullRequest
2 голосов
/ 18 января 2011

Мне удалось отобразить изображение в метке в Qt, используя что-то вроде следующего:

transformPixels(0,0,1,imheight,imwidth,1);//sets unsigned char** imageData

unsigned char* fullCharArray = new unsigned char[imheight * imwidth];
     for (int i = 0 ; i < imheight ; i++)
         for (int j = 0 ; j < imwidth ; j++)
                fullCharArray[(i*imwidth)+j] = imageData[i][j];

QImage *qi = new QImage(fullCharArray, imwidth, imheight, QImage::Format_RGB32);

ui->viewLabel->setPixmap(QPixmap::fromImage(*qi,Qt::AutoColor));

Так что fullCharArray - это массив неподписанных символов, которые были отображены из 2D-массива imageData, вДругими словами, это imheight * imwidth байтов.

Проблема в том, что кажется, что только часть моего изображения отображается на этикетке.Изображение очень большое.Я хотел бы отобразить полное изображение, уменьшенное, чтобы уместить его на этикетке, с сохранением соотношения сторон.

Кроме того, этот формат QImage был единственным, который я смог найти, который, казалось, давал мне точное представление оизображение, которое я хочу показать, это то, что я должен ожидать?Я использую только один байт на пиксель (беззнаковые значения - значения от 0 до 255), и похоже, что RGB32 не имеет особого смысла для этого типа данных, но ни один из других не отображал ничего удаленно правильного

editСледуя совету Дэна Галлагерса, я реализовал этот код:

QImage *qi = new QImage(fullCharArray, imwidth, imheight, QImage::Format_RGB32);
int labelWidth = ui->viewLabel->width();
int labelHeight = ui->viewLabel->height();

QImage small = qi->scaled(labelWidth, labelHeight,Qt::KeepAspectRatio);
ui->viewLabel->setPixmap(QPixmap::fromImage(small,Qt::AutoColor));

Но из-за этого моя программа неожиданно завершает работу с кодом 0

Ответы [ 3 ]

6 голосов
/ 18 января 2011

Qt напрямую не поддерживает построение изображений в градациях серого. Вам нужно использовать 8-битное индексированное цветное изображение:

QImage * qi = new QImage(imageData, imwidth, imheight, QImage::Format_Indexed8);
for(int i=0;i<256;++i) {
    qi->setColor(i, qRgb(i,i,i));
}
5 голосов
/ 18 января 2011

QImage имеет члена scaled. Итак, вы хотите изменить свой setPixmap звонок на что-то вроде:

QImage small = qi->scaled(labelWidth, labelHeight, Qt::KeepAspectRatio);
ui->viewLabel->setPixmap(QPixmap::fromImage(small, Qt::AutoColor);

Обратите внимание, что scaled не изменяет исходное изображение qi; он возвращает новый QImage, который является уменьшенной копией оригинала.

Re-Edit:

Для преобразования из 1-байтовой шкалы серого в 4-байтовую шкалу RGB:

 QImage qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
 for (int i = 0; i < imheight; i++)
 {
     for (int j = 0; j < imwidth; j++)
     {
         qi->setPixel(i, j, QRgb(imageData[i][j], imageData[i][j], imageData[i][j]));
     }
 }

Затем масштабируйте qi и используйте масштабированную копию в качестве растрового изображения для viewLabel.

3 голосов
/ 29 сентября 2011

Я также сталкивался с подобной проблемой - QImage :: scaled возвращает черные изображения. Быстрый обходной путь, который работал в моем случае, состоял в том, чтобы преобразовать QImage в QPixmap, масштабировать и преобразовывать тогда. Как это:

QImage resultImg = QPixmap::fromImage(image)
  .scaled( 400, 400, Qt::KeepAspectRatio )
  .toImage();

где «изображение» - исходное изображение. Я не знал о проблеме форматирования, прежде чем читать эту ветку - но на самом деле мои изображения 1-битные черно-белые.

С уважением, Валентин Хайниц

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