Russian Qt Forum

Qt => Мультимедиа => Тема начата: deMax от Май 28, 2013, 10:03



Название: QImage большие файлы
Отправлено: deMax от Май 28, 2013, 10:03
painter->drawImage(screenArea.rect(), *image, imgArea.rect());
painter->drawImage(0,0,QImage("./img/1.jpg"));
рисует черным цветом (изображение точно не черное), меньшие размеры отображает корректно

команда: qDebug()<<image->size()<<QColor (image->pixel(5,5)).lightness();
вывод: QSize(6400, 3200) 151

Рисование в QGLWidget через QPainter.


Название: Re: QImage большие файлы
Отправлено: xokc от Май 28, 2013, 11:43
А в чём собственно вопрос-то? Или это просто баг репорт?


Название: Re: QImage большие файлы
Отправлено: deMax от Май 28, 2013, 13:00
Вопрос в том, как нарисовать картинку больших размеров.

ps. Qt 4.7.4 (из набора Qt_SDK ~1_2_1), Win7

Предположу что под линухом опять все ок будет.


Название: Re: QImage большие файлы
Отправлено: xokc от Май 28, 2013, 13:07
Можно попробовать, например, копировать нужные данные во временный QPixmap и рисовать уже его.


Название: Re: QImage большие файлы
Отправлено: Bepec от Май 28, 2013, 13:08
Тестовый проект с собранным релизом и дллками кидай на файлообменник и давай ссылку. И будет тебе ответ.


Название: Re: QImage большие файлы
Отправлено: Igors от Май 28, 2013, 14:04
По нынешним временам до "большого" еще далеко (до 1 Gb все работает везде). Другое дело OpenGL (карта) имеет ограничение на размер текстуры (обычно 8192), Это стоит проверить


Название: Re: QImage большие файлы
Отправлено: deMax от Май 29, 2013, 15:44
Тестовый проект с собранным релизом и дллками кидай на файлообменник и давай ссылку. И будет тебе ответ.
зачем релиз и библиотеки? у всех же qt стоит.
http://rghost.ru/46350884

6400x3200 рисует черным
24000х12000 не загружает
2353х3521 работает


Название: Re: QImage большие файлы
Отправлено: Bepec от Май 29, 2013, 20:25
Потому что каждая версия Qt имеет свой неповторимый вкус и цвет. И баг или сочетание страшных вещей в одной версии может вызвать ошибку, а в другой нет :)


Название: Re: QImage большие файлы
Отправлено: _OLEGator_ от Май 30, 2013, 08:51
Это не баг. QImage не предназначен для работы с такими большими изображениями.


Название: Re: QImage большие файлы
Отправлено: xokc от Май 30, 2013, 12:03
Это не баг. QImage не предназначен для работы с такими большими изображениями.
Почему бы тогда об этом не упомянуть в документации, ну и, естественно, явным образом реализовать в коде, на уровне хотя-бы адекватного результата QImage::Format или QImage::isNull?


Название: Re: QImage большие файлы
Отправлено: Авварон от Май 30, 2013, 15:01
А, собственно, почему не предназначен? Тоже вчера столкнулся с тем, что имадж спамит в консоль про невозможность выделить память. Но в это слабо верится, на 64битной-то системе. Кто-нибудь в сорцы глядел?


Название: Re: QImage большие файлы
Отправлено: _OLEGator_ от Май 30, 2013, 15:08
Пишут, что 32768x32768 для 16-битного цвета. И что width * height * depth_for_format должно быть меньше INT_MAX.
http://stackoverflow.com/questions/7080052/qimage-qpixmap-size-limitations
А так у меня тоже не грузились большие изображения. Но это априори неправильный подход - грузить такие изображения в память, надо либо резать, либо читать блоками.


Название: Re: QImage большие файлы
Отправлено: Авварон от Май 30, 2013, 15:22
Пишут, что 32768x32768 для 16-битного цвета. И что width * height * depth_for_format должно быть меньше INT_MAX.
http://stackoverflow.com/questions/7080052/qimage-qpixmap-size-limitations
А так у меня тоже не грузились большие изображения. Но это априори неправильный подход - грузить такие изображения в память, надо либо резать, либо читать блоками.
Вы правы, я таки заглянул в код (ф-ия QImageData::create):

Код:
    // sanity check for potential overflows
    if (INT_MAX/depth < width
        || bytes_per_line <= 0
        || height <= 0
        || INT_MAX/uint(bytes_per_line) < height
        || INT_MAX/sizeof(uchar *) < uint(height))
        return 0;
Можно попробовать отрефакторить код QImage так, чтобы не было перемножений а-ля bytes_per_line*widgth*height, которые бы присваивались в int32.
К сожалению, иногда огромные картинки бывают, и невозможность ее загрузить целиком может напрягать.


Название: Re: QImage большие файлы
Отправлено: Bepec от Май 30, 2013, 15:47
Хм. Зачем вам такую агромадину в память?
Я после пары программ на гигантских массивах данных для себя решил, что все операции должны проводиться с минимумом данных. Нечего грузить память.


Название: Re: QImage большие файлы
Отправлено: Авварон от Май 30, 2013, 16:00
Хм. Зачем вам такую агромадину в память?
Я после пары программ на гигантских массивах данных для себя решил, что все операции должны проводиться с минимумом данных. Нечего грузить память.

Ну, всегда можно заммапить кусок памяти. Но, допустим, у вас есть картографические картинки, которые вы хотите батчпроцессить. Открыли файл, применили фильтр, записали, закрыли файл. Как считать "кусок" имаджа я не преставляю (если он не лежит как массив ARGB на диске) не городя велосипеда.
Ничего плохого нет в том, что картинка большая - главное, чтобы в память влезла.


Название: Re: QImage большие файлы
Отправлено: _OLEGator_ от Май 30, 2013, 16:09
А QImageReader?
http://www.prog.org.ru/topic_18847_0.html


Название: Re: QImage большие файлы
Отправлено: Авварон от Май 30, 2013, 16:38
А QImageReader?
http://www.prog.org.ru/topic_18847_0.html

Окей, уболтали, когда я писал свои хэнлеры, я не обратил внимание на эту опцию.


Название: Re: QImage большие файлы
Отправлено: deMax от Май 31, 2013, 08:23
Пишут, что 32768x32768 для 16-битного цвета. И что width * height * depth_for_format должно быть меньше INT_MAX.
http://stackoverflow.com/questions/7080052/qimage-qpixmap-size-limitations
А так у меня тоже не грузились большие изображения. Но это априори неправильный подход - грузить такие изображения в память, надо либо резать, либо читать блоками.
32768x32768 16384 x 16384 x 16бит
Цитировать
6400x3200 рисует черным
24000х12000 не загружает
2353х3521 работает
32бита это адресация 4гб, 6400х3200х32 625Мб