Я пытаюсь использовать QImageReader для одновременного чтения частей файла изображения (на плитку), чтобы для очень больших изображений они не считывались в память с диска до тех пор, пока их не нужно отобразить.
Кажется, я сталкиваюсь с некоторыми проблемами безопасности потоков.
Это то, что у меня сейчас есть:
#include "rastertile.h"
QMutex RasterTile::mutex;
RasterTile::RasterTile()
{
}
//RasterTile::RasterTile(QImageReader *reader, int nBlocksX, int nBlocksY, int xoffset, int yoffset, int nXBlockSize, int nYBlockSize)
RasterTile::RasterTile(QString filename, int nBlocksX, int nBlocksY, int xoffset, int yoffset, int nXBlockSize, int nYBlockSize)
: Tile(nBlocksX, nBlocksY, xoffset, yoffset, nXBlockSize, nYBlockSize)
{
this->reader = new QImageReader(filename);
connect(&watcher,SIGNAL(finished()),this,SLOT(updateSceneSlot()));
}
void RasterTile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
if(image.isNull())
{
TilePainter=painter;
TileOption=option;
TileWidget=widget;
future = QtConcurrent::run(this, &RasterTile::LoadTilePixmap);
watcher.setFuture(future);
}else
{
QRectF imageRect = image.rect();
painter->drawImage(imageRect, image);
}
}
QImage RasterTile::LoadTilePixmap()
{
QMutexLocker locker(&mutex);
QImage img(nBlockXSize, nBlockYSize, QImage::Format_RGB32);
QRect rect(tilePosX*nBlockXSize, tilePosY*nBlockYSize, nBlockXSize, nBlockYSize);
reader->setClipRect(rect);
reader->read(&img);
if(reader->error())
{
qDebug("Not null error");
qDebug()<<"Error string is: "<<reader->errorString();
}
return img;
}
Так что это в основном создание нового читателя для каждой плитки и обновление переменной image для суперкласса, которую я могу затем нарисовать.
Это, кажется, дает мне много ошибок от читателя, который просто говорит: «Невозможно прочитать данные изображения»
Я думаю, что это, вероятно, связано с тем, что многие плитки обращаются к одному и тому же.файл, но я не знаю, как это доказать или исправить.
Я думаю, Qt использует libjpeg и libpng и все остальное для чтения различных форматов изображений.