Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deefox от Январь 27, 2017, 09:45



Название: QImageReader
Отправлено: deefox от Январь 27, 2017, 09:45
Доброго времени суток, прошу у вас совета.

Используя пример, из книги Андрея Боровского, написал проект чтения изображения больших размеров.

Проблема заключается в том, что изображения считывается методом read() по нарастающей и очень долго.

Здесь я создаю массив, состоящий и классов с фрагментами.

Код:
   
 /*Читаем файл*/
    file.setFileName("bigimg.jpg");
    file.open(QIODevice::ReadOnly);
 
    /*Сохраняем изображение в буфере*/
    QByteArray ba = file.readAll();
    QBuffer io(&ba);
 
    file.close();
 
    /*Открываем и считываем с помощью метода ImageReqader*/
    io.open(QIODevice::ReadOnly);
 
    /*загружаем картинку в фрагменты, где i - по ширине, j - по высоте*/
    for (int i = 0; i < Division; ++i) {
        for (int j = 0; j < Division; ++j) {
            imgf = new ImageFrag();
            imgf->load(&io, i,j);
            listFrag.append(imgf);
        }
    }

далее сам метод с чтением и сохранением в память фрагмента

Код:
void ImageFrag::load(QIODevice *ioDevice, const int w, int h)
{
    io = ioDevice;
 
    io->reset();
 
    QImageReader ir(io);
    ir.setClipRect(QRect(sizeF*w,sizeF * h,sizeF,sizeF));
 
    QImage img = ir.read();
 
   
    QIODevice *chankIntf = new QBuffer(chank,this);
    chankIntf->open(QIODevice::WriteOnly);
    img.save(chankIntf,"PNG");
 
    delete chankIntf;
}

и так получается что у нас картинка размерами 9000x9000, сторона фрагмента 1000x1000 Division = 9, так вот получается, что время чтения возрастает эквивалентно возрастанию j в цикле.

в чем может быть проблема?


Название: Re: QImageReader
Отправлено: GreatSnake от Январь 27, 2017, 10:48
в чем может быть проблема?
Может потому что
Код
C++ (Qt)
imgf = new ImageFrag();
в j-м цикле?


Название: Re: QImageReader
Отправлено: deefox от Январь 27, 2017, 10:55
в чем может быть проблема?
Может потому что
Код
C++ (Qt)
imgf = new ImageFrag();
в j-м цикле?

я постоянно выделаю под новый элемент, запускаю в нем функцию load и потом помещаю его в QList, потом выделяю под новый элемент и т.д. или вы что то другое имеете ввиду? засек выполнение функции load результат:

203
230
329
422
514
609
718
797
889

141
249
344
436
515
624
719
811
893


вынес из цикла, все осталось так же
Код:
    ImageFrag  imgf[81];

    /*загружаем картинку в фрагменты, где i - по ширине, j - по высоте*/
    for (int i = 0; i < Division; ++i) {
        for (int j = 0; j < Division; ++j) {

            imgf[j+i*9].load(&io, i,j);
            listFrag.append(imgf);
        }
    }


Название: Re: QImageReader
Отправлено: Igors от Январь 28, 2017, 11:42
Есть простой дедовский способ: загрузить имедж целиком, и из него нарезать имеджи/фрагменты. Минус - (слишком) большой имедж в память не влезет. Только если это актуально придется связываться с чтением по частям. Тут дело темное, какие-то форматы могут читать имедж "начиная с N-ной строки", другие нет. Не исключено что Вы хотели прочитать кусок, а в действительности читается все и потом отдается нужный кусок - вот и тормоза. Во всяком случае "по столбцам" точно никто не умеет. Поэтому я бы делал так

- читать N (полных) строк, из этого "большого куска" уже нарезать 9 фрагментов по столбцам
- читать следующие N строк и.т.д

Edit: да, ну и конечно попробовать все делать с одним QImageReader не создавая его для каждого куска а лишь меняя clipRect