Отображение растровых данных в представлении QT - PullRequest
0 голосов
/ 21 мая 2019

Я пишу библиотеку изображений с нуля. Я написал консольное приложение, которое загружает растровое изображение, выполняет некоторые манипуляции и записывает вывод в другое растровое изображение.Теперь я хотел бы построить пользовательский интерфейс поверх моего приложения.Поэтому я хотел бы сделать это в Qt Creator, так как у меня есть некоторый опыт работы с Qt, и я хочу, чтобы он работал на нескольких платформах.

Вот мой код, который загружает растровое изображение:

FILE *streamIn = fopen("path/to/file.bmp", "rb");

if (streamIn == (FILE *)0)
{
  printf("Unable to open file\n");
}

unsigned char bmpHeader[54];
unsigned char bmpColorTable[1024];

for (int i = 0; i < 54; i++)
{
  bmpHeader[i] = getc(streamIn);
}

int width = *(int *)&bmpHeader[18];
int height = *(int *)&bmpHeader[22];
int bitDepth = *(int *)&bmpHeader[28];

if (bitDepth <= 8)
{
  fread(bmpColorTable, sizeof(unsigned char), 1024, streamIn);
}
unsigned char buf[height * width];
fread(buf, sizeof(unsigned char), (height * width), streamIn);
fclose(streamIn);

Как мне вставить это в мой интерфейс?Я уже пробовал что-то вроде:

const QImage image(buf, width, height, QImage::Format_Grayscale8);
imageLabel->setPixmap(QPixmap::fromImage(image));

Но это приводит к крошечному белому изображению, а не к тому, что я только что прочитал.Возможно, я могу пропустить создание QImage и сразу создать QPixmap?То, что я попробовал сейчас, не работает, так что, может быть, кто-то более опытный может сказать мне, как это сделать.Когда я загружал исходное изображение, я хотел бы обновить представление, когда я делаю некоторые манипуляции, чтобы пользователь мог видеть изменения.

Я знаю, что это может быть сделано намного проще с QImageReader, но это для целей обучения.

1 Ответ

0 голосов
/ 23 мая 2019

Я не знаю, что я сделал не так, но теперь все работает так, как должно. Но есть одна проблема с чтением растрового формата, подобного этому, в QImage, см. Почему bmps хранится вверх ногами?

Итак, что я делаю сейчас, это:

QImage img(width, height, QImage::Format_Grayscale8);
    for(int row = 0; row < img.height(); row++){
        for(int col = 0; col < img.width(); col++) {
            int color = (int)_imgInBuffer[row * img.width() + col];
            img.setPixel(col, height - row - 1, qRgb(color, color, color));
        }
    }

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

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