Консультация № 60909
01.11.2006, 13:57
0.00 руб.
0 7 3
Доброе время суток эксперты!
У меня в программе вместо кнопок используется TImage.
Есть разные картинки на разные состояния. Как сделать так, чтобы картинка заменялась другой плавно?
Скины не предлагайте использовать.
Заранее спасибо. Хочется тероию или практику. ;-)

Обсуждение

Неизвестный
01.11.2006, 14:07
общий
Что значит плавно? И какой тип изображения? *.bmp, *.jpe, *.ico?
Неизвестный
01.11.2006, 14:38
общий
это ответ
Здравствуйте, Delphin!
Что означает "плавно"?
По теории: вспомните как делаются рисованные мультфильмы :)
На правктике: нарисуйте промежуточные картинки и последовательно заменяйте в TImage.
Попробуйте анимированные GIF-ы, но нужно компонент другой (например, из RXLib TRxGifAnimator).
Еще можно другим способом: перерисовывать новое состояние по точкам в случайном порядке. Т.е. выбираем случайным образом X и Y, заменяем этот пиксел в старой картинке на пиксел из новой. И так 2*<количество пикселей> раз. Потом заменяем картинку целиком. Может получится симпатично.
Творческих успехов :)
Неизвестный
01.11.2006, 14:39
общий
Алгоритмы смены плавных картинок могут быть разными, например, они смещаются, заменяя друг друга, как в мультфильмах, за несколько итераций цвет каждого пикселя постепенно переходит из цвета одной картинки в цвед другой картинки и т.д.
Неизвестный
01.11.2006, 14:41
общий
это ответ
Здравствуйте, Delphin!

Смотря как плавно, можно использовать эффект выкатывания
например справа

For i:= 1 to image1.width do
begin
image1.canvas.draw(i,0,BitMap);
Sleep(10); {задержка чтобы не быстро выезджала в милисекундах правда она прогу полностью стопорит, но можно на крайняк через таймер сделать}
end;

Если посложнее см в примере, там заполнение формы точками но код не доделан, некогда. Нужна проверка на присутствие изменений в точке.

Приложение:
var rect:Trect;i,j,x,y:integer;label b;beginrandomize;pic1:=Tbitmap.Create;pic1.LoadFromFile(‘c:\temp\test\mnfrm.bmp‘);for i:=1 to pic1.Width dofor j:=1 to pic1.Height dobeginb:x:=random(pic1.Width); y:=random(pic1.Height); if form1.Canvas.Pixels[x,y]=clsilver then goto b else form1.Canvas.Pixels[x,y]:=pic1.Canvas.Pixels[x,y];end;
Неизвестный
01.11.2006, 14:45
общий
это ответ
Здравствуйте, Delphin!

//Функция загрузки изображения из ресурсов программы
procedure LoadBMPImage(Instance: cardinal; const ResName: PChar; Image: TImage);
var Picture: TBitmap;
begin
try
Picture:=TBitmap.Create;
Picture.LoadFromResourceName(Instance,ResName);
Image.Picture.Assign(Picture)
finally
Picture.Free
end;
end;

//Процедура рисования текста
procedure SetText(const FontColor: TColor; BtnText: string; Image: TImage);
var Size: tSize;
OffSet: DWord;
begin
Size:=Image.Canvas.TextExtent(BtnText);
Offset:=MakeWord((Image.Height - Size.cy) div 2,
(Image.Width - Size.cx) div 2);
Image.Canvas.Brush.Color := clBtnFace;
Image.Canvas.Font.Color := FontColor;
Image.Canvas.TextOut(Hi(OffSet),Lo(OffSet),BtnText);
end;

//Нажатие на Image1
procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
LoadBMPImage(hInstance,‘ID_BMP2‘,TImage(Sender)); //картинка нажатой кнопки
SetText(clBlue,,‘Кнопка нажата‘,Image1)
end;
end;

//Отпускание на Image1
procedure TForm1.ImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
LoadBMPImage(hInstance,‘ID_BMP1‘,TImage(Sender)); //картинка отжатой кнопки
SetText(clBlue,‘Кнопка отпущена‘,Image1) //Установка текста
end;
end;

Неизвестный
01.11.2006, 21:53
общий
Нет. Одна картинка переходит в другую плавно. Не выкатывается, а переходит.
Неизвестный
01.11.2006, 21:54
общий
Формат Jpeg.
Форма ответа