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

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

Как програмно изменить размер картинки


Vic-z ©   (2007-01-28 16:44:00) 

Доброе время суток.
Подскажите как можно подогнать размер загруженого из ресурса битмапа
к размеру Image1, что то не пойму как правильно сделать
размер Image1 меняется, а размер загруженого битмапа не хочет :(

procedure TForm1.FormActivate(Sender: TObject);
var
w,h: Integer;
TOP_IM:TBitMap;
begin
w:=StrToInt(Form_razmer.Edit_shirina.Text) div 10;
h:=StrToInt(Form_razmer.Edit_visota.Text) div 10;
TOP_IM:=TBitMap.Create;
TOP_IM.LoadFromResourceName(HInstance,'TOP_IM');
Image1.AutoSize:=true;
Image1.Stretch:=true;
Image1.Picture.Bitmap.Width:=w;
Image1.Picture.Bitmap.Height:=h;

TOP_IM.Canvas.StretchDraw(TOP_IM.Canvas.ClipRect,TOP_IM);
TOP_IM.Width:=w;
Image1.Canvas.Draw(0,0,TOP_IM);
end;


Olivetti   (2007-01-28 21:30:00) [1]

_SuN_   (28.01.07 21:19) [19]

М-да...


_SuN_   (2007-01-28 21:19:00) [2]


procedure LoadAvatar(img : timage; ms : tmemorystream; bg : tcolor);
var bmp : tbitmap;
begin
bmp:=tbitmap.Create;
ms.Seek(0,0);
bmp.LoadFromStream(ms);
img.Canvas.Brush.Color:=bg;
img.Canvas.FillRect(rect(0,0,img.Width,img.Height));
if (bmp.Width>bmp.Height)
   then img.Canvas.StretchDraw(rect(0,abs(img.Height-trunc((img.Width/bmp.Width)*bmp.Height)) div 2,img.Width,trunc((img.Width/bmp.Width)*bmp.Height)),bmp)
   else img.Canvas.StretchDraw(rect(abs(img.Width-trunc((img.Height/bmp.Height)*bmp.Width)) div 2,0,trunc((img.Height/bmp.Height)*bmp.Width),img.Height),bmp);
bmp.Destroy;
end;


Olivetti   (2007-01-28 18:27:00) [3]

Или... убери из [17] FormActivate(), и сделай:

procedure TForm_razmer.Edit_shirinaChange();
begin
 Form1.Image1.Width := StrToInt(Form_razmer.Edit_shirina.Text) div 10;
end;

procedure TForm_razmer.Edit_shirinaChange();
begin
 Form1.Image1.Height := StrToInt(Form_razmer.Edit_visota.Text) div 10;
end;


Olivetti   (2007-01-28 18:23:00) [4]

ну когда закрывается форма для изменения размеров Image1 , тогда становиться активной главная форма

Она становится активной не только когда закрывается форма для изменения размеров. Какой смысл перезагружать растр из ресурса каждый раз, когда форма становится активной? Пользователь, понимаешь ли, бывает, переключается на другие приложения, или на другие формы твоего приложения (если имеются).

Воспользуйся советом [16].

Или делай загрузку растра из ресурса только при старте приложения, а размер Image1 меняй когда надо, типа:

procedure TForm1.FormCreate();
begin
 Image1.Stretch := true;
 Image1.Picture.Bitmap.LoadFromResourceName(HInstance,'TOP_IM');
end;

procedure TForm1.FormActivate();
begin
 Image1.Width := StrToInt(Form_razmer.Edit_shirina.Text) div 10;
 Image1.Height := StrToInt(Form_razmer.Edit_visota.Text) div 10;
end;


Больше ничего не надо, типа...


antonn   (2007-01-28 18:12:00) [5]

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


Vic-z   (2007-01-28 18:07:00) [6]


> Ты уверен, что этот код должен быть на OnActivate?
>

ну когда закрывается форма для изменения размеров Image1 , тогда становиться активной главная форма


Olivetti   (2007-01-28 18:04:00) [7]

Ты уверен, что этот код должен быть на OnActivate?


Olivetti   (2007-01-28 18:02:00) [8]

begin
 Image1.Width := StrToInt(Form_razmer.Edit_shirina.Text) div 10;
 Image1.Height := StrToInt(Form_razmer.Edit_visota.Text) div 10;
 Image1.Stretch := true;
 Image1.Picture.Bitmap.LoadFromResourceName(HInstance,'TOP_IM');
end;


Vic-z   (2007-01-28 17:53:00) [9]


> Опиши задачу конкретнее.

на форме Image1 размером 100х100 , в ресурсе битмат размером 10х10
переменными w,h нужно менять размер Image1 (с этим нет проблемы)
но битмат из ресурса нужно нарисовать на Image1 не 10х10 а размером Image.width x Image.height


Olivetti   (2007-01-28 17:46:00) [10]

если ставлю Image1.AutoSize := false; то размер Image1 не меняется

Тогда это к чему? Размер Image1 должен меняться? Опиши задачу конкретнее.


Vic-z   (2007-01-28 17:45:00) [11]


> битмап к Image1

битмап к Image1


Olivetti   (2007-01-28 17:41:00) [12]

как можно подогнать размер загруженого из ресурса битмапа
к размеру Image1


Так тебе что к чему подгонять: Image1 к битмапу, или битмап к Image1?
Ты это, определись.


antonn   (2007-01-28 17:40:00) [13]

TOP_IM:=TBitMap.Create;
try
TOP_IM.LoadFromResourceName(HInstance,'TOP_IM');
image1.width:=TOP_IM.width;
image1.height:=TOP_IM.height;
TOP_IM.width:=w;
TOP_IM.height:=h;
TOP_IM.canvas.copyrect( rect(0,0,TOP_IM.width,TOP_IM.height), TOP_IM.canvas, rect(0,0,image1.width,image1.height) );
image1.assign( TOP_IM ); //вот тут не помню, возможно нужно просто сделать следующие строчки, а можеи и не надо
image1.width:=TOP_IM.width;
image1.height:=TOP_IM.height;
finally
TOP_IM.free;
end;

:)


antonn   (2007-01-28 17:39:00) [14]

для моего кода нужно Image1.AutoSize:=false; Image1.Stretch:=false;
ах, да, я зыбал сделать это перед копированием:)
TOP_IM.width:=w;
TOP_IM.height:=h;


Vic-z   (2007-01-28 17:30:00) [15]


> Olivetti   (28.01.07 17:26) [4]
>
> Больше, типа, ничего не надо.

если ставлю Image1.AutoSize := false; то размер Image1 не меняется
:::(((
задолбался ужо :( не выходит у меня, поможите плиз


Olivetti   (2007-01-28 17:27:00) [16]

Olivetti   (28.01.07 17:26) [4]

Больше, типа, ничего не надо.


Olivetti   (2007-01-28 17:26:00) [17]

Image1.AutoSize := false;
Image1.Stretch := true;
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'TOP_IM');


antonn   (2007-01-28 17:23:00) [18]

я надеюсь мой код не был просто засунут в обработчик конопки?


Vic-z   (2007-01-28 17:17:00) [19]

что то не пашет :(


antonn   (2007-01-28 17:05:00) [20]

во первых повесить код на кнопку:) (это имхо, но в activate его вешать - глупость)

TOP_IM:=TBitMap.Create;
try
TOP_IM.LoadFromResourceName(HInstance,'TOP_IM');
TOP_IM.canvas.copyrect( rect(0,0,w,h), TOP_IM.canvas, rect(0,0,TOP_IM.width,TOP_IM.height) );
image1.assign( TOP_IM ); //вот тут не помню, возможно нужно просто сделать следующие строчки, а можеи и не надо
image1.width:=TOP_IM.width;
image1.height:=TOP_IM.height;
finally
TOP_IM.free;
end;


Наверх

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