![]() |
|
![]() ![]() ![]() |
|
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Ситуация такая. Я пишу фотоальбом. При поиске/импорте фотографий программа должна их отобразить в виде маленьких миниатюр. Для сего нужно, чтобы реальные изображения с компа прорисовались сначала на TBitmap'е, потом в нем же уменьшились, а потом уже отобразились для юзера. Как это сделать? Мне нужно, чтобы изображение было, скажем, не более 180px в высоту и не более 200px в ширину. Плюс должны сохраняться пропорции изображения.
Со всем этим хорошо справляется свойство Stretch у TImage, но в этом случае, если, скажем, предположить, что в программу загружено 1000 фотографий с разрешением 3000х4000 пикселов, то все эти фотки должны будут по сути находиться в памяти (ведь Stretch только визуально уменьшает изображение, а в памяти оно остается в первозданном виде и первозданном весе/размере), а значит, потребуется просто дикое количество памяти. Значит, Stretch не особо подходит. Как быть? |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 1 Всего: 92 |
В памяти явно надо хранить thumbnail'ы изображений (уменьшенные копии), а сами фотографии открывать по необходимости, при первой же возможности закрывать. Сделать эти копии можно множеством способов, что удобнее использовать для Билдера - не знаю, для МФС куча примеров здесь, но можно и самому сочинить что-нить типа: открываем картинку, рисуем на растр в памяти ее уменьшенную копию, закрываем картинку, пошли за следующей.
Но вот несколько пугают эти цифры
такое количество таких больших фотографий будет перерабатываться не просто медленно, а офигенно медленно. С этим надо тебе что-то придумать, но тут трудно подсказать, надо смотреть по месту (небольшими партиями обрабатывать, сохранять thumbnail куда-нить, еще что-нибудь придумать). |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
В этом и состоит вопрос. Как? ![]() |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
StretchBlt() хотя бы в MSDN посмотри...
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Klin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1938 Регистрация: 7.10.2002 Где: Краснодар Репутация: 20 Всего: 25 |
имхо какие функции не используй, все равно файл открывать придется (и загружать память программы).
-------------------- Я человек - попробуйте обвинить меня за это. |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Klin, вопрос не в том, чтобы файл загружать. Просто если во все TImage загрузить такого размера изображения, получится, мягко говоря, накладно для памяти. А если использовать один TImage в качестве буфера, а на реальных имагах отображать только на Canvas, то расход памяти в процессе работы программы будет совсем небольшим.
Порылся с функциями. Я вообще в первом посте не о том речь завел. ![]() Теперь формулировка задачи поточнее: надо загрузить в буферный TImage (невидимый, соответственно) большое изображение, затем сделать его нормальных размеров через Proportional, затем отрисовать на целевом имаге на Canvas. Я сделать этого почему-то не смог, прошу вашей помощи. |
|||
|
||||
Klin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1938 Регистрация: 7.10.2002 Где: Краснодар Репутация: 20 Всего: 25 |
Ну енто воще элементарно
![]()
Далее можем изменить место вставки, путь и т.п. Вроде все просто, или я опять че-то не понял ![]() Добавлено через 1 минуту и 27 секунд да и в строчке номер 8 также определяется размер нового минисайза. -------------------- Я человек - попробуйте обвинить меня за это. |
|||
|
||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Зачем использовать TImage в качестве буфера, для этого есть TPicture. Вообще если эскизы изображений создавать каждый раз при запуске программы, то будет страшно тормозить. Обычно их кэшируют, и обновляют только при добавлении файлов. Винда создаёт в каждой папке с изображениями файл Thumbs.db именно для этого. Еще можно не обрабатывать сразу все доступные изображения, а только те которые отображаются на экране, это должно сэкономить часть ресурсов.
Только на выходе должно получится что угодно кроме эскиза изображения. Для изображений разного размера получатся эскизы разного размера, совсем непохожие на оригинал.
|
||||||
|
|||||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Есть еще хороший вариант. Если это фотка, то такой жпег обычно содержит в себе еще Thumbnail в формате jpeg. Нужно залезть в EXIF и просто оттуда его извлечь.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Klin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1938 Регистрация: 7.10.2002 Где: Краснодар Репутация: 20 Всего: 25 |
Alexeis, случайно не знаете как извлечь? Хоть вариант не прет для остальных форматов...
Добавлено через 1 минуту и 7 секунд воооо еще нарыл ![]() Только для JPEG. Есть свойство Scale, оно и изменяет размер JPEG до нужного, сечас реализуем ![]() -------------------- Я человек - попробуйте обвинить меня за это. |
|||
|
||||
Klin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1938 Регистрация: 7.10.2002 Где: Краснодар Репутация: 20 Всего: 25 |
ps
имхо тоже только визуалка. -------------------- Я человек - попробуйте обвинить меня за это. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Это не базовый вариант, а дополнительный, который позволит значительно сохранить время обработки тех картинок где есть Thumbnail ы. К сожалению компоненты встречал только на делфи. На самом деле формат EXIF не так уж сложен, так что если есть желание и время, то можно самому достать. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |