Плавное изменение картинки в Timage при наведении мышки
Модератор: Модераторы
Плавное изменение картинки в Timage при наведении мышки
Имеется на форме объект TImage. В TImage отображается картинка PNG.
Как сделать так, чтобы при наведении указателя мышки на TImage исходная картинка плавно за 2 секунды менялась на любую другую PNG которую можно скинуть в папку с программой.
А также когда мышку обираем от TImage, то TImage плавно за 2 секунды возвращается в исходное состояние.
Подскажите пожалуйста, как это сделать?
Как сделать так, чтобы при наведении указателя мышки на TImage исходная картинка плавно за 2 секунды менялась на любую другую PNG которую можно скинуть в папку с программой.
А также когда мышку обираем от TImage, то TImage плавно за 2 секунды возвращается в исходное состояние.
Подскажите пожалуйста, как это сделать?
Простенькая процедура Blend в помощь !
(Исправлено по совету iskander-а )
Две картинки на входе одна на выходе..
Amount (от нуля до единицы) задает степень смешения .
Процедура не самая быстрая но для этой задачи ее досточно.
Заточена под 24-х битные битмапы.
(Исправлено по совету iskander-а )
Код: Выделить всё
// Прозрачность
procedure Blend( Src1,Src2,Dst: TBitmap; Amount: extended);
var x,y:integer;
ps1,ps2,pd:pbytearray;
begin
for y:=0 to Src1.Height-1 do begin
ps1:=Src1.ScanLine[y];
ps2:=Src2.ScanLine[y];
Dst.BeginUpdate; ;
pd:=Dst.ScanLine[y];
for x:=0 to Src1.Width-1 do begin
pd[x*3]:=round((1-Amount)*ps1[x*3]+Amount*ps2[x*3]);
pd[x*3+1]:=round((1-Amount)*ps1[x*3+1]+Amount*ps2[x*3+1]);
pd[x*3+2]:=round((1-Amount)*ps1[x*3+2]+Amount*ps2[x*3+2]);
end;
Dst.EndUpdate;
end;
end;
Две картинки на входе одна на выходе..
Amount (от нуля до единицы) задает степень смешения .
Процедура не самая быстрая но для этой задачи ее досточно.
Заточена под 24-х битные битмапы.
Последний раз редактировалось Alex2013 02.03.2021 18:37:02, всего редактировалось 2 раза.
user6745 писал(а):Подскажите пожалуйста, как это сделать?
1) Своими силами: Путем изменения прозрачности, оно же альфа канал. 2 картинки у одной альфа=1.0 у другой альфа=0.0, изменения у первой от 1 до 0 - пропадает, у другой 0 до 1 - появляется и наоборот.
2) GIF - иметь анимационную картинку, и вовремя запускать и останавливать на нужном кадре.
https://www.youtube.com/watch?v=EVk28wzHNII,
Wile64 https://www.youtube.com/watch?v=KPEaSXhcMqM https://github.com/aducom/gifanim,
Кмк, Blend от Alex2013 вполне подойдёт, если довести до рабочего состояния.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Спасибо. Попробую предложенные варианты. Посмотрю что получится проще и удобней сделать.
olegy123 писал(а):Путем изменения прозрачности, оно же альфа канал. 2 картинки у одной альфа=1.0 у другой альфа=0.0, изменения у первой от 1 до 0 - пропадает, у другой 0 до
Хм ! Интересно ! Но есть недостаток прозрачность элементов лазаруса работает не очень надежно + нужно выводить две картинки одну на другой и "молится на систему" надеясь что все будет нормально .
iskander писал(а): если довести до рабочего состояния.
Добавлено спустя 8 минут 22 секунды:
О интересная штуковина посмотрю на досуге (я такие приблуды коллекционирую )
Alex2013 писал(а):"простая как двери" процедура
Может она конечно и дверь, но как думаешь, вот такой вызов скомпилируется?
Код: Выделить всё
Blend(Image1.Picture.Bitmap, Image2.Picture.Bitmap, Image3.Picture.Bitmap, r);
iskander писал(а):Может она конечно и дверь, но как думаешь, вот такой вызов скомпилируется?
Разумеется скомпилируется! Это кусок вот этого модуля.... (Из проекта "цифровая оптика" )
Последний раз редактировалось Alex2013 02.03.2021 18:40:21, всего редактировалось 4 раза.
Alex2013 писал(а):Разумеется скомпилируется!
Код: Выделить всё
main.pas(53,76) Error: Can't take the address of constant expressions
У меня компилятор не той системы?
iskander писал(а):Alex2013 писал(а):Разумеется скомпилируется!Код: Выделить всё
main.pas(53,76) Error: Can't take the address of constant expressions
У меня компилятор не той системы?
А если внимательно посмотреть то видно что у меня там var стоит.
procedure Blend(var Src1,Src2,Dst: TBitmap; Amount: extended);
Зы
Я уже было подумал, что это я сам опечатался при копировании и чистке от закомментированных блоков.
Последний раз редактировалось Alex2013 02.03.2021 18:39:00, всего редактировалось 3 раза.
Alex2013 писал(а):А если внимательно посмотреть то видно что у меня там var стоит
Так я о том же, и он там уместен, как зонтик у рыбы.
iskander писал(а):Так я о том же, и он там уместен, как зонтик у рыбы.
Ну в принципе согласен ... var это артефакт и исходной версии для Кол ..
И w и h можно убрать, ибо хлам.
Добавлено спустя 6 минут 18 секунд:
Ок. Но это уже придирки ...
iskander писал(а):И w и h можно убрать, ибо хлам.
Ок. Но это уже придирки ...
Последний раз редактировалось Alex2013 02.03.2021 18:29:43, всего редактировалось 3 раза.
