QT - есть ли класс для объединения нескольких изображений в одно? - PullRequest
1 голос
/ 25 июня 2011

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

Спасибо за совет.

Ответы [ 3 ]

6 голосов
/ 25 июня 2011

Вместо того, чтобы копировать отдельные пиксели, я бы просто рисовал каждое отдельное изображение на QPixmap, достаточно большом, чтобы объединить все изображения. Затем можно создать коллаж, нарисовав каждое отдельное изображение на коллаже следующим образом (непроверенный код):

QList<QPixmap> images;
QPixmap collage;

// Make sure to resize collage to be able to fit all images.
...

for (QList<QPixmap>::const_iterator it = images.begin(); it != images.end(); ++it)
{
    int x = 0;
    int y = 0;

    // Calculate x & y coordinates for the current image in the collage.
    ...
    QPainter painter(&collage);
    painter.drawPixmap(
            QRectF(x, y, (*it).width(), (*it).height()), *it,
            QRectF(0, 0, (*it).width(), (*it).height()));
}

Обратите внимание, что вместо QPixmap можно также использовать QImage. QPixmap оптимизирован для отображения на экране. Более подробную информацию смотрите в документации Qt .

0 голосов
/ 21 сентября 2012

Код выше не работает для меня, я не могу понять, почему.

Мне нужен был коллаж:
PicA | PicB | Pic ... | ... |
Я нашел нечто подобное с QImage, и этот код работает.
(проверенный код):

const int S_iconSize = 80;     //The pictures are all quadratic.
QList<const QPixmap*> t_images;//list with all the Pictures, PicA, PicB, Pic...
QImage resultImage(S_iconSize*t_images.size(), S_iconSize, QImage::Format_ARGB32_Premultiplied);
QPainter painter;

painter.begin(&resultImage);
for(int i=0; i < t_images.size(); ++i)
{
    painter.drawImage(S_iconSize*i, 0, t_images.at(i)->toImage(), 0, 0, S_iconSize, S_iconSize, Qt::AutoColor);
}
painter.end();

QPixmap resultingCollagePixmap = QPixmap::fromImage(resultImage);

Я знаю, что это ужасно, потому что QImage конвертируется в QPixmap и наоборот, но это работает. Так что, если у кого-то есть идея, как запустить приведенный выше код (от Ton van den Heuvel), я был бы рад. (Может быть, это просто отсутствующий QPainter ???)

Привет

0 голосов
/ 25 июня 2011

Нет, вы не хотите делать этот пиксель за пикселем. QImage - это QPaintDevice .Таким образом, вы можете загружать их, отображать их друг в друга и сохранять в нескольких форматах по своему усмотрению.И, конечно, отобразить их на экране.

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