Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > Уменьшение картинки с сохранением пропорций |
Автор: mr.Anderson 23.6.2007, 14:20 |
Ситуация такая. Я пишу фотоальбом. При поиске/импорте фотографий программа должна их отобразить в виде маленьких миниатюр. Для сего нужно, чтобы реальные изображения с компа прорисовались сначала на TBitmap'е, потом в нем же уменьшились, а потом уже отобразились для юзера. Как это сделать? Мне нужно, чтобы изображение было, скажем, не более 180px в высоту и не более 200px в ширину. Плюс должны сохраняться пропорции изображения. Со всем этим хорошо справляется свойство Stretch у TImage, но в этом случае, если, скажем, предположить, что в программу загружено 1000 фотографий с разрешением 3000х4000 пикселов, то все эти фотки должны будут по сути находиться в памяти (ведь Stretch только визуально уменьшает изображение, а в памяти оно остается в первозданном виде и первозданном весе/размере), а значит, потребуется просто дикое количество памяти. Значит, Stretch не особо подходит. Как быть? |
Автор: mr.Anderson 23.6.2007, 16:27 | ||
В этом и состоит вопрос. Как? ![]() |
Автор: jonie 23.6.2007, 17:41 |
StretchBlt() хотя бы в MSDN посмотри... |
Автор: Klin 24.6.2007, 20:35 |
имхо какие функции не используй, все равно файл открывать придется (и загружать память программы). |
Автор: mr.Anderson 24.6.2007, 21:09 |
Klin, вопрос не в том, чтобы файл загружать. Просто если во все TImage загрузить такого размера изображения, получится, мягко говоря, накладно для памяти. А если использовать один TImage в качестве буфера, а на реальных имагах отображать только на Canvas, то расход памяти в процессе работы программы будет совсем небольшим. Порылся с функциями. Я вообще в первом посте не о том речь завел. ![]() Теперь формулировка задачи поточнее: надо загрузить в буферный TImage (невидимый, соответственно) большое изображение, затем сделать его нормальных размеров через Proportional, затем отрисовать на целевом имаге на Canvas. Я сделать этого почему-то не смог, прошу вашей помощи. |
Автор: Klin 24.6.2007, 22:23 | ||
Ну енто воще элементарно ![]()
Далее можем изменить место вставки, путь и т.п. Вроде все просто, или я опять че-то не понял ![]() Добавлено через 1 минуту и 27 секунд да и в строчке номер 8 также определяется размер нового минисайза. |
Автор: Lazin 25.6.2007, 08:33 | ||||||
Зачем использовать TImage в качестве буфера, для этого есть TPicture. Вообще если эскизы изображений создавать каждый раз при запуске программы, то будет страшно тормозить. Обычно их кэшируют, и обновляют только при добавлении файлов. Винда создаёт в каждой папке с изображениями файл Thumbs.db именно для этого. Еще можно не обрабатывать сразу все доступные изображения, а только те которые отображаются на экране, это должно сэкономить часть ресурсов.
Только на выходе должно получится что угодно кроме эскиза изображения. Для изображений разного размера получатся эскизы разного размера, совсем непохожие на оригинал.
|
Автор: Alexeis 25.6.2007, 09:28 |
Есть еще хороший вариант. Если это фотка, то такой жпег обычно содержит в себе еще Thumbnail в формате jpeg. Нужно залезть в EXIF и просто оттуда его извлечь. |
Автор: Klin 25.6.2007, 10:53 |
Alexeis, случайно не знаете как извлечь? Хоть вариант не прет для остальных форматов... Добавлено через 1 минуту и 7 секунд воооо еще нарыл ![]() Только для JPEG. Есть свойство Scale, оно и изменяет размер JPEG до нужного, сечас реализуем ![]() |
Автор: Klin 25.6.2007, 11:17 |
ps имхо тоже только визуалка. |
Автор: Alexeis 25.6.2007, 11:24 |
Это не базовый вариант, а дополнительный, который позволит значительно сохранить время обработки тех картинок где есть Thumbnail ы. К сожалению компоненты встречал только на делфи. На самом деле формат EXIF не так уж сложен, так что если есть желание и время, то можно самому достать. |