Очень большие файлы QImage и Memory Mapped в QT - PullRequest
2 голосов
/ 25 июля 2010

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

 QFile file("Boston City Flow.jpg");
 if(!file.open(QIODevice::ReadOnly))
   QMessageBox::information(this, "Error", "Error");

 qint64 size = file.size();
 unsigned char *mmf = file.map(0, size);

 QImage image;
 image.loadFromData(mmf, size, NULL);

Моя программа должна обрабатывать очень большие изображения.

1 Ответ

5 голосов
/ 26 июля 2010

Попробуйте с объявлением mmf const:

const unsigned char* mmf = file.map(0, size);

, а затем посмотрите на векторы QImage, особенно

QImage( const uchar*, int width, int height, Format )

QImage :: QImage (const uchar * data, int width, int height, Format format)

В документах сказано:

"Буфер должен оставаться действительным в течение всего жизненного цикла QImage, и все копии, которые не были изменены или иным образом отделены от исходного буфераИзображение не удаляет буфер при уничтожении. [...] В отличие от аналогичного конструктора QImage, который принимает неконстантный буфер данных, эта версия никогда не изменит содержимое буфера. Например, вызывая QImage :: bits () вернет глубокую копию изображения, а не буфер, переданный конструктору. Это обеспечивает эффективность построения QImage из необработанных данных без возможности изменения необработанных данных. "

Примечаниечто неконстантная версия uchar * копирует сразу, поэтому обязательно передайте const uchar *.Также обратите внимание, что вызов неконстантных методов QImage скопирует данные.

...