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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: вопрос по QImage  (Прочитано 14183 раз)
define
Гость
« : Июль 18, 2011, 12:40 »

Добрый день,
подскажите пожалуйста, как можно разбить изображение в QImage на несколько QRect?
Например левая половина изображения в одном прямоугольнике, а другая соответственно во втором.
Спасибо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 18, 2011, 12:41 »

QImage QImage::copy ( const QRect & rectangle = QRect() ) const
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
define
Гость
« Ответ #2 : Июль 18, 2011, 13:44 »

QImage QImage::copy ( const QRect & rectangle = QRect() ) const

ага, так, а если сделать немного иначе.
Предположим у меня есть путь к изображению. Как подгрузить по отдельности эти 2 прямоугольника?
(те не загружать QImage целиком и не разбивать его)
Записан
Fess
Гость
« Ответ #3 : Июль 18, 2011, 13:52 »

Никак.
Если не хотите писать свой MyImage, который умеет грузить изображения по кускам (не читая весь файл). Не удивлюсь, если некоторые форматы вообще нельзя будет загрузить таким образом.
Записан
define
Гость
« Ответ #4 : Июль 18, 2011, 14:08 »

а если прочитать по байтам, а потом
QImage fromData ( const QByteArray & data, const char * format = 0 )
так не получится?
Записан
Fess
Гость
« Ответ #5 : Июль 18, 2011, 19:38 »

Вот я вам и говорю. Нужно смотреть формат файла, вручную считывать нужные фрагменты, а они будут идти скорее всего с каким-то шагом.
Скармливать все полученное QImage и пр.
Куда уж лучше - прочитал изображение - взял фрагмент - используй.
Или у вас оч. большие изображения и ограничения по производительности?
Попробуйте описать задачу. Может достаточно просто вынести загрузку в отдельный поток? Или кешировать фрагменты?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 18, 2011, 19:56 »

Никак.
Если не хотите писать свой MyImage, который умеет грузить изображения по кускам (не читая весь файл). Не удивлюсь, если некоторые форматы вообще нельзя будет загрузить таким образом.
Формат который умеет грузить "по прямоугольникам" - мне такой вообще неизвестен. Многие позволяют грузить по строкам - но там разбираться с каждым себе дороже

(те не загружать QImage целиком и не разбивать его)
Именно так. Сначала загрузить весь файл, нарезать его на нужные прямоугольники, сохранить их во временных файлах и с ними уже манипулировать.

Edit: в принципе это стандартная техника подкачки больших изображений постранично
« Последнее редактирование: Июль 18, 2011, 19:58 от Igors » Записан
define
Гость
« Ответ #7 : Июль 18, 2011, 19:57 »

Задача состоит в отображении огромного изображения. Причем необходимо выводить "промежуточные" результаты.
(те если грузим одно большое изображение, то сначала отображается половина, а затем и все изображение(по сути по мере загрузки)). Загрузку я выполняю в отдельном потоке:
Код:
void ShowImage::run()
{
    //для уничтожения потока
    setTerminationEnabled(true);

    AdvImage tmp = list->at(pos);

    QImage image(tmp.getPath());//tmp.getPath() - путь к изображению

    int temp_h = image.size().height();
    int temp_w = image.size().width();

    if(temp_w>temp_h)//сравнение ширины и высоты изображения
    {
        temp_h=_h;
        _h=_w;
        _w=temp_h;
    }

    image = image.scaled(_w,_h);

    label->setPixmap(QPixmap::fromImage(image));}
была ещё мысль использовать QImageReader, а именно метод setQuality. Попробовал и вне зависимости от значения изображение грузилось в одном и том же качестве.
Код:
QImageReader reader;
    reader.setQuality(20);
    reader.setFileName(tmp.getPath());
    QImage image = reader.read();
Как-то вот так. В чем проблема с setQuality и что можете сказать насчет разбиения изображения. Спасибо.
Записан
define
Гость
« Ответ #8 : Июль 18, 2011, 21:10 »

Сначала загрузить весь файл
Ох и долго же этот может выполняться Грустный
Записан
Ubuntu_linux
Гость
« Ответ #9 : Июль 18, 2011, 22:41 »

Никак.
Если не хотите писать свой MyImage, который умеет грузить изображения по кускам (не читая весь файл). Не удивлюсь, если некоторые форматы вообще нельзя будет загрузить таким образом.
А вот и не правда! Достаточно прочитать асистент по QImageReader
который может загружать изображение в нужном размере и также
загрузить нужную область изображения. Удачи!
Записан
define
Гость
« Ответ #10 : Июль 18, 2011, 22:46 »

А вот и не правда! Достаточно прочитать асистент по QImageReader
который может загружать изображение в нужном размере и также
загрузить нужную область изображения. Удачи!
рабочий или хоть какой пример можно? Заранее благодарю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июль 19, 2011, 11:50 »

Достаточно прочитать асистент по QImageReader
который может загружать изображение в нужном размере и также
загрузить нужную область изображения.
Ладно, давайте почитаем. Пишут
Цитировать
QImageIOHandler::ClipRect   1   The clip rect, or ROI (Region Of Interest). A handler that supports this option is expected to only read the provided QRect area from the original image in read(), before any other transformation is applied.
Но только если reader (конкретного формата) поддерживает такую возможность. Смотрим напр для PNG
Код
C++ (Qt)
bool QPngHandler::supportsOption(ImageOption option) const
{
   return option == Gamma
       || option == Description
       || option == ImageFormat
       || option == Quality
       || option == Size;
}
 
Не вижу здесь ClipRect, значит с PNG эта радость недоступна.  Смотрим для JPG - тоже нет. Для др. форматов - опять нет. Или я ошибаюсь?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Июль 19, 2011, 12:21 »

Для др. форматов - опять нет. Или я ошибаюсь?
Судя по исходникам только в svg)
Записан

Qt 5.11/4.8.7 (X11/Win)
Ubuntu_linux
Гость
« Ответ #13 : Июль 19, 2011, 14:31 »

Достаточно прочитать асистент по QImageReader
который может загружать изображение в нужном размере и также
загрузить нужную область изображения.
Ладно, давайте почитаем. Пишут
Цитировать
QImageIOHandler::ClipRect   1   The clip rect, or ROI (Region Of Interest). A handler that supports this option is expected to only read the provided QRect area from the original image in read(), before any other transformation is applied.
Но только если reader (конкретного формата) поддерживает такую возможность. Смотрим напр для PNG
Код
C++ (Qt)
bool QPngHandler::supportsOption(ImageOption option) const
{
   return option == Gamma
       || option == Description
       || option == ImageFormat
       || option == Quality
       || option == Size;
}
 
Не вижу здесь ClipRect, значит с PNG эта радость недоступна.  Смотрим для JPG - тоже нет. Для др. форматов - опять нет. Или я ошибаюсь?
А вот и не правда! Надо било просто попробивать и все стало бы на
свои места. Все нормально работает с jpg и png.

QImageReader *reader=new QImageReader("file name");
reader->setClipRect(QRect(0,0,100,300));
ui->label_pix->setPixmap(QPixmap::fromImage(reader->read()));

Вот такие дела, прикиньте...
Записан
BRE
Гость
« Ответ #14 : Июль 19, 2011, 14:35 »

Ubuntu_linux, а точно что реадер не загружает всю картинку в память, а потом вырезает нужный кусок?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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