Russian Qt Forum
Ноябрь 24, 2024, 11:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QImageReader  (Прочитано 3502 раз)
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 в цикле.

в чем может быть проблема?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Январь 27, 2017, 10:48 »

в чем может быть проблема?
Может потому что
Код
C++ (Qt)
imgf = new ImageFrag();
в j-м цикле?
Записан

Qt 5.11/4.8.7 (X11/Win)
deefox
Гость
« Ответ #2 : Январь 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);
        }
    }
« Последнее редактирование: Январь 27, 2017, 11:07 от deefox » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 28, 2017, 11:42 »

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

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

Edit: да, ну и конечно попробовать все делать с одним QImageReader не создавая его для каждого куска а лишь меняя clipRect
« Последнее редактирование: Январь 28, 2017, 11:49 от Igors » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 23.