Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пропорциональный ресайз картинки под Imagelist и DrawGrid [D6, XP]


pavelkq ©   (2009-01-11 09:48:00) 

На форме имеются 2 компонента Imagelist и DrawGrid. Через диалог выбираю графический файл и масштабирую функцией под размеры ячейки в DrawGrid (создаю миниатюры).
Function ResizeBitmap(bmp: TBitmap; nw, nh: Integer):TBitmap;
begin
 Result:=TBitmap.Create;
 Result.Width:=nw;
 Result.Height:=nh;
 Result.Canvas.StretchDraw(Rect(0,0,nw,nh),bmp);
end;

Размер ячейки 80х60, т.е. пропроция 4х3. Когда картинки с теми же пропорциями, то картинка масштабируется красиво. Но если картинка имеет другие пропорции, то она жутко растягивается. Так же эта картинка (миниатюра) записывается в Imagelist, размеры которого тоже строго определены. Как сделать так, чтобы картинка дополнялась чистыми полями по краям до правильных пропорций?
P.S. Правильно ли я инициализирую результат и где его освободить?


pavelkq   (2009-01-11 12:13:00) [1]

Ну, допустим, я понял, что пропорция переданного изображения 3х4, т.е. оно вертикальное. Тогда изменение должно произойти  до (nh*3/4) x 60. При nh=80 получаем размеры 45х60. Но при вставке этого изображения в Imagelist и DrawGrid размером 80х60 вываливается ошибка о несоответствии размеров изображения. Посему, надо как-то дополнить недостающую ширину до 80 пустыми полями или прпросить их не ругаться.


KSergey   (2009-01-11 10:48:00) [2]

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

> P.S. Правильно ли я инициализирую результат и где его освободить?

Правильно, но красиво при таком способе освободить не получится.
Лучше ввести еще один параметр и требовать на входе в функцию заранее созданный TBitmap для результата.
Тогда и освобождение будет логичным: где создали, там и освободили.


Наверх

Титульная страница Поиск, карта сайта Написать письмо