Консультация № 145391
29.09.2008, 10:50
0.00 руб.
0 2 2
Здравствуйте Уважаемые Экспкрты!
Проблема следующая.
После загрузки файла с расширением BMP в Image c установленным свойством AutoSize=True картинка полностью не видна на экране. При использовании свойства Strech нарушается пропорция фото. Использую Delphi 5, в котором свойство пропорциональности для Image я не нашел. Подскажите как загрузить фото в Image, чтобы была видна вся фотография и не нарушалась пропорция?
За ранее благодарю.

Обсуждение

Неизвестный
29.09.2008, 12:11
общий
это ответ
Здравствуйте, Geb2003!
Для реализации предлагаю Вам изменить пропорционально размеры картинки, предварительно вычислив коэффициент изменения.
Код и описание в приложении.

Приложение:
var
picture, picture_temp: TBitMap;
koef: real;
begin
Image1.Picture:= nil;
picture:=TBitMap.Create;
picture_temp:= TBitMap.Create;
picture.LoadFromFile('logo1.bmp');
picture_temp.LoadFromFile('logo1.bmp'); {Временные копии картинки}
if picture.Width/Image1.Width < picture.Height/Image1.Height then
koef:= picture.Height/Image1.Height
else
koef:= picture.Width/Image1.Width; {вычисление коэффициента}
picture.Width:= Round(picture.Width / koef);
picture.Height:= Round(picture.Height / koef); {получение новых размеров картинки}
picture.Canvas.StretchDraw(picture.Canvas.ClipRect, picture_temp); {перезагрузка картинки в новые пропорциональные(!) размеры}
Image1.Picture.Bitmap:= picture; {загружаем в Image1 без изменений}
picture.Free;
picture_temp.Free; {освобождение ресурсов}

end;
давно
Профессионал
153662
1070
30.09.2008, 11:41
общий
это ответ
Здравствуйте, Geb2003!
Попробуйте следующий код, использую у себя в проги:

var
Back: TBitMap; // картинка

Back.LoadFromFile(OpenPicture1.Dialog.FileName);
Image1.canvas.fillrect(Image1.canvas.cliprect);
image1.Canvas.StretchDraw(paintboxDestRect(Back),Back);

Приложение:
function paintboxDestRect(bmp:TBitMap): TRect;
var
w, h, cw, ch: Integer;
xyaspect: Double;
begin
w:= bmp.Width;
h:= bmp.Height;
cw:= vdmonitor.image1.ClientWidth;
ch:= vdmonitor.image1.ClientHeight;
if ((w > cw) or (h > ch)) then
begin
if (w > 0) and (h > 0) then
begin
xyaspect := w / h;
if w > h then
begin
w:= cw;
h:= Trunc(cw / xyaspect);
if h > ch then // woops, too big
begin
h:= ch;
w:= Trunc(ch * xyaspect);
end;
end
else
begin
h:= ch;
w:= Trunc(ch * xyaspect);
if w > cw then // woops, too big
begin
w:= cw;
h:= Trunc(cw / xyaspect);
end;
end;
end
else
begin
w:= cw;
h:= ch;
end;
end;
with Result do
begin
Left:= 0;
Top:= 0;
Right:= w;
Bottom:= h;
end;
OffsetRect(Result, (cw - w) div 2, (ch - h) div 2);
end;
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа