Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уменьшение картинки с сохранением пропорций 
:(
    Опции темы
mr.Anderson
Дата 23.6.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Ситуация такая. Я пишу фотоальбом. При поиске/импорте фотографий программа должна их отобразить в виде маленьких миниатюр. Для сего нужно, чтобы реальные изображения с компа прорисовались сначала на TBitmap'е, потом в нем же уменьшились, а потом уже отобразились для юзера. Как это сделать? Мне нужно, чтобы изображение было, скажем, не более 180px в высоту и не более 200px в ширину. Плюс должны сохраняться пропорции изображения.

Со всем этим хорошо справляется свойство Stretch у TImage, но в этом случае, если, скажем, предположить, что в программу загружено 1000 фотографий с разрешением 3000х4000 пикселов, то все эти фотки должны будут по сути находиться в памяти (ведь Stretch только визуально уменьшает изображение, а в памяти оно остается в первозданном виде и первозданном весе/размере), а значит, потребуется просто дикое количество памяти. Значит, Stretch не особо подходит. Как быть?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
zkv
Дата 23.6.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



В памяти явно надо хранить thumbnail'ы изображений (уменьшенные копии), а сами фотографии открывать по необходимости, при первой же возможности закрывать. Сделать эти копии можно множеством способов, что удобнее использовать для Билдера - не знаю, для МФС куча примеров здесь, но можно и самому сочинить что-нить типа: открываем картинку, рисуем на растр в памяти ее уменьшенную копию, закрываем картинку, пошли за следующей. 

Но вот несколько пугают эти цифры 
Цитата(mr.Anderson @  23.6.2007,  14:20 Найти цитируемый пост)
что в программу загружено 1000 фотографий с разрешением 3000х4000 пикселов

такое количество таких больших фотографий будет перерабатываться не просто медленно, а офигенно медленно. С этим надо тебе что-то придумать, но тут трудно подсказать, надо смотреть по месту (небольшими партиями обрабатывать, сохранять thumbnail куда-нить, еще что-нибудь придумать).
PM MAIL   Вверх
mr.Anderson
Дата 23.6.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Цитата
рисуем на растр в памяти ее уменьшенную копию

В этом и состоит вопрос. Как? smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
jonie
Дата 23.6.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



StretchBlt() хотя бы в MSDN посмотри...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Klin
Дата 24.6.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



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


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
mr.Anderson
Дата 24.6.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Klin, вопрос не в том, чтобы файл загружать. Просто если во все TImage загрузить такого размера изображения, получится, мягко говоря, накладно для памяти. А если использовать один TImage в качестве буфера, а на реальных имагах отображать только на Canvas, то расход памяти в процессе работы программы будет совсем небольшим.

Порылся с функциями. Я вообще в первом посте не о том речь завел. smile Какой Stretch, о Proportional речь. Если его врубить, изображение подгонится по размеру имага с сохранением пропорций.

Теперь формулировка задачи поточнее: надо загрузить в буферный TImage (невидимый, соответственно) большое изображение, затем сделать его нормальных размеров через Proportional, затем отрисовать на целевом имаге на Canvas. Я сделать этого почему-то не смог, прошу вашей помощи.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Klin
Дата 24.6.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Ну енто воще элементарно smile

Код

 #include <jpeg.hpp> //  подключаем библиотеку для работы
  . . . . . . . . .
 TJPEGImage * Image = new TJPEGImage; // создаем временный JPEG
 Image->LoadFromFile("I:\\1.jpg"); // загружаем изображения
 Graphics::TBitmap * Bitmap = new Graphics::TBitmap; // временный битмап
 Bitmap->Assign(Image); // загружаем в него наш JPEG
 int myX = 0, myY = 0; // наши новые координаты
 int StepX = Image->Height/100, StepY = Image->Width/100; // рассчитываем шаг
 for (int x = 0; x<=Image->Width; x+=StepX) { // проходим по X
 myY = 0;
  for (int y = 0; y<=Image->Height; y+=StepY) { // проходим по Y
   Canvas->Pixels[myX][myY] = Bitmap->Canvas->Pixels[x][y]; // читаем и записываем пикселы X и Y
   myY++;
  }
  myX++;
 }
 delete Image; // очищаем память


Далее можем изменить место вставки, путь и т.п. Вроде все просто, или я опять че-то не понял   smile

Добавлено через 1 минуту и 27 секунд
да и в строчке номер 8 также определяется размер нового минисайза.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Lazin
Дата 25.6.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Цитата

А если использовать один TImage в качестве буфера, а на реальных имагах отображать только на Canvas, то расход памяти в процессе работы программы будет совсем небольшим.

Зачем использовать TImage в качестве буфера, для этого есть TPicture. Вообще если эскизы изображений создавать каждый раз при запуске программы, то будет страшно тормозить. Обычно их кэшируют, и обновляют только при добавлении файлов. Винда создаёт в каждой папке с изображениями файл Thumbs.db именно для этого. Еще можно не обрабатывать сразу все доступные изображения, а только те которые отображаются на экране, это должно сэкономить часть ресурсов.
Цитата

Ну енто воще элементарно

Только на выходе должно получится что угодно кроме эскиза изображения. Для изображений разного размера получатся эскизы разного размера, совсем непохожие на оригинал.
Код

 #include <jpeg.hpp> //  подключаем библиотеку для работы
  . . . . . . . . .
 TJPEGImage * Image = new TJPEGImage; // создаем временный JPEG
 Image->LoadFromFile("1.jpg"); // загружаем изображения
 Graphics::TBitmap* bmp = new Graphics::TBitmap();
 TRect r(0,0,Image->Width*0.2,Image->Height*0.2);
 bmp->Height = r.Height();
 bmp->Width  = r.Width();
 bmp->Canvas->StretchDraw(r,Image);
 Image1->Picture->Bitmap->Assign(bmp);//показываем результат
 delete bmp;
 delete Image;

PM MAIL Skype GTalk   Вверх
Alexeis
Дата 25.6.2007, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Есть еще хороший вариант. Если это фотка, то такой жпег обычно содержит в себе еще Thumbnail в формате jpeg. Нужно залезть в EXIF и просто оттуда его извлечь.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Klin
Дата 25.6.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Alexeis, случайно не знаете как извлечь? Хоть вариант не прет для остальных форматов...

Добавлено через 1 минуту и 7 секунд
воооо еще нарыл smile

Только для JPEG. Есть свойство Scale, оно и изменяет размер JPEG до нужного, сечас реализуем smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Klin
Дата 25.6.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



ps 
Цитата(mr.Anderson @  24.6.2007,  22:09 Найти цитируемый пост)
нормальных размеров через Proportional, 

имхо тоже только визуалка.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(Klin @  25.6.2007,  10:53 Найти цитируемый пост)
Хоть вариант не прет для остальных форматов...

  Это не базовый вариант, а дополнительный, который позволит значительно сохранить время обработки тех картинок где есть Thumbnail ы. К сожалению компоненты встречал только на делфи. На самом деле формат EXIF не так уж сложен, так что если есть желание и время, то можно самому достать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1078 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.