Чтение файлов изображений с помощью QImageReader с помощью QtConcurrent

Я пытаюсь использовать 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 и все остальное для чтения различных изображений форматы.

14
задан Vertexwahn 12 May 2016 в 10:11
поделиться