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

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

Плавный переход


Страницы:   1 2 3

CodeMaster ©   (2009-01-23 22:40:00) 

Здраствуйте мастера! Не подскажите алгоритм плавного перехода одного изображения в другое? Пытался в Интернете найти информацию по этой теме, но ничего не нашёл. Только два примера с очень долгой обработкой.


codemaster   (2009-01-26 11:00:00) [1]

Всем большое спасибо за помощь


antonn   (2009-01-25 19:01:00) [2]

а сам пример вывода полупрозрачной картинки с определенной прозрачностью ( :) ) есть тут - http://desksoft.ru/index.php?forum=13&th=187&page=1
там на битмап рисуются иконки с альфаканалом, он позволяет рисовать почти в любом месте картинки "в тему", привязки к заднику нет. Таким образом нужен общий бэкграунд и несколько таких кнопок, они могут быть совсем рядом и пересекаться, при этом "активироваться" сразу несколько и не перетирают друг друга при перерисовке (в отличии от скинов плеера, где элементы расположены так, что не пересекаются).


antonn   (2009-01-25 18:54:00) [3]

вот глянь пример - http://desksoft.ru/index.php?downloads=attachments&id=136
сильно тормозит? у меня - никак, код твой :)
параметры "быстродействия" подкручиваются в функции OnDraw_out (в ней в примере рисуется всего 10 кадров из 255) и интервалом срабатывания таймера (свой юзется потому, что он точнее TTimer).

Конечно для каждого объекта должен быть свой таймер, move_pos и bt_progress, чтобы они независимо работали.

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


CodeMaster   (2009-01-25 16:50:00) [4]

Вот код на вхождение в кнопку:
var

Bm1,Bm2: TBitmap;

i: Integer;
x,y: Integer;
begin

  Bm1:= TBitmap.Create;
  Bm2:= TBitmap.Create;
  Bm1.Width:= FrameWidth;
  BM2.Width:= FrameWidth;
  Bm1.Height:= FrameHeight;
  Bm2.Height:= FrameHeight;

if Clicked then begin

BitBlt(Bm1.Canvas.Handle,0,0,FrameWidth,FrameHeight,BackBitmap.Canvas.Handle,Fra meWidth * (FrameCount div 2),0,SRCCOPY);
 BitBlt(Bm2.Canvas.Handle,0,0,FrameWidth,FrameHeight,BackBitmap.Canvas.handle,Fra meWidth * ((FrameCount div 2) + 1),0,SRCCOPY);
end
else begin
BitBlt(Bm1.Canvas.Handle,0,0,FrameWidth,FrameHeight,BackBitmap.Canvas.Handle,0,0 ,SRCCOPY);
 BitBlt(Bm2.Canvas.Handle,0,0,FrameWidth,FrameHeight,BackBitmap.Canvas.handle,Fra meWidth,0,SRCCOPY);
end;

  Morphing(bm1,Bm2);

 Bm1.Destroy;
 Bm2.Destroy;

   inherited;

end;


CodeMaster   (2009-01-25 16:49:00) [5]

Вот ещё один вопрос у меня эффект морфинга используется при наведении на кнопку. Но когда идёт морфинг и я навожу курсор на другую кнопку с ней морфинга не происходит. Ожидается когда закончится морфинг с предыдущей кнопкой, а потом уже начинается морфинг с кнопкой на которую я навёл курсор.
Можно ли это исправить?


antonn   (2009-01-25 16:29:00) [6]

Тут неправильный подход.
Нужно не в цикле рисовать 255 картинок, ожидая пока все "продавит", а таймером с малой задержкой рисовать лишь часть кадров (ну как выше сказано штук 30). Тогда анимация будет одинаково длиться по времени на любых компьютерах (исключая древноту типа P166, разумеется)


CodeMaster   (2009-01-25 16:25:00) [7]

Intel Core 2 Duo 2.67 GHz 1333 FSB

Недостаточность заключается в том что на слабеньких компьютерах эта операция занимает очень много времени


antonn   (2009-01-25 16:22:00) [8]


> KilkennyCat ©   (25.01.09 16:14) [35]
>
>

ну не укусил, не получается у тебя :)
скорость - это такое растяжимое понятие, каждый его меряет по своему - кто то в тиках в секунду, кто то в нагрузке на cpu...
Пожалуйста. Извиняю :)


> CodeMaster ©   (25.01.09 16:10) [34]

Передавай два битмапа (первый который выводится на экран, второй исходный, их размеры и координаты вывода).
Могу порекомендовать не выводить все 255 кадров если они рисуются в течении 1 секунды, все равно человек все не усвоит, можно рисовать ну.. 30 кадров, экономия немалая.
И еще раз повторюсь - как выражается недостаточность скорости? и какой процессор?


CodeMaster   (2009-01-25 16:20:00) [9]

Как вот этот алгоритм в мою программу поставить.. ??
Подстроил под себя вот так
procedure TPOGiButton.Morphing(Bm1,Bm2: TBitmap; progress: Integer);
var
 dstPixel, srcPixel: PRGBQuad;
 Weight: Integer;
 I: Integer;
begin
 srcPixel := Bm2.ScanLine[Bm2.Height - 1];
 dstPixel := Bm1.ScanLine[Bm1.Height - 1];
 Weight := MulDiv(256, Progress, 100);
 for I := (Bm1.Width * Bm1.Height) - 1 downto 0 do
 begin
   with dstPixel^ do
   begin
     Inc(rgbRed, (Weight * (srcPixel^.rgbRed - rgbRed)) shr 8);
     Inc(rgbGreen, (Weight * (srcPixel^.rgbGreen - rgbGreen)) shr 8);
     Inc(rgbBlue, (Weight * (srcPixel^.rgbBlue - rgbBlue)) shr 8);
   end;
   Inc(srcPixel);
   Inc(dstPixel);
 end;
end;

Использую вот так    
for i:= 1 to 100 do  begin

  Morphing(bm1,Bm2,i);
  Canvas.Draw(0,0,bm1);
end;
И ничего не работает


KilkennyCat   (2009-01-25 16:17:00) [10]


> СodeMaster ©   (25.01.09 16:10) [34]


Что именно там непонятного?


KilkennyCat   (2009-01-25 16:14:00) [11]


> antonn ©   (25.01.09 15:51) [33]


Ну что Вы, Антон Андреевич, как можно кусать Вас! Я просто хотел обратить Ваше внимание, что автор не единожды жаловался на скорость, вот и подумал, что может быть, Ваше ценное замечание несколько излишне? Но Вы мне снова все разъяснили. Спасибо! Извините.


CodeMaster   (2009-01-25 16:10:00) [12]

procedure Effect119(Display, Image: TBitmap; W, H, X, Y, Progress: Integer);
var
 dstPixel, srcPixel: PRGBQuad;
 Weight: Integer;
 I: Integer;
begin
 srcPixel := Image.ScanLine[H - 1];
 dstPixel := Display.ScanLine[H - 1];
 Weight := MulDiv(256, Progress, 100);
 for I := (W * H) - 1 downto 0 do
 begin
   with dstPixel^ do
   begin
     Inc(rgbRed, (Weight * (srcPixel^.rgbRed - rgbRed)) shr 8);
     Inc(rgbGreen, (Weight * (srcPixel^.rgbGreen - rgbGreen)) shr 8);
     Inc(rgbBlue, (Weight * (srcPixel^.rgbBlue - rgbBlue)) shr 8);
   end;
   Inc(srcPixel);
   Inc(dstPixel);
 end;
end;

Извлёк вот этот алгоритм, только не пойму как его присобачить.


antonn   (2009-01-25 15:51:00) [13]


> KilkennyCat ©   (25.01.09 15:00) [30]
>
>
> > antonn ©   (25.01.09 14:32) [29]
>
> Может, не будете издеваться? Это же не в Ваших правилах.
>

Ни разу не издевка. Возможно автору не нравится секундная загрузка cpu, вызваная понятно чем. А возможно у него экран в 16bit. Еще много чего возможно, но очевидно только тем, кто имеет представление о сабже.
Хочешь укусить - сначала подумай.


CodeMaster   (2009-01-25 15:42:00) [14]

Спасибо


KilkennyCat   (2009-01-25 15:03:00) [15]


> CodeMaster ©   (25.01.09 11:01) [28]

http://www.delphiarea.com/там есть некий компонет, TPicShow. Если мне не изменяет память с исходниками, где довольно неплохо написаны эффекты.


KilkennyCat   (2009-01-25 15:00:00) [16]


> antonn ©   (25.01.09 14:32) [29]

Может, не будете издеваться? Это же не в Ваших правилах.


antonn   (2009-01-25 14:32:00) [17]

медленно работает? :)


CodeMaster   (2009-01-25 11:01:00) [18]

Есть ли способ реализовать это пошустрее?


CodeMaster   (2009-01-25 11:00:00) [19]

Алгоритм вот такой:
procedure TPOGiButton.Morphing(Bm1,Bm2: TBitmap);
const
 count = 250;
var
 i: integer;
 x, y: integer;
 bm: TBitMap;
 p1, p2, p: PByteArray;

begin
 bm := TBitMap.Create;

Bm.Width:= FrameWidth;
Bm.Height:= FrameHeight;
 bm.PixelFormat := pf24bit;
  bm1.PixelFormat := pf24bit;
    bm2.PixelFormat := pf24bit;

     Canvas.Draw(0,0,bm1);
 for i := 1 to count - 1 do
 begin
   for y := 0 to bm.Height - 1 do
   begin
     p := bm.ScanLine[y];
     p1 := bm1.ScanLine[y];
     p2 := bm2.ScanLine[y];
     for x := 0 to bm.Width * 3 - 1 do
       p^[x] := round((p1^[x] * (count - i) + p2^[x] * i) / count);
   end;

    Application.ProcessMessages;
             Canvas.Draw(0,0,bm);
   Application.ProcessMessages;
   if Application.Terminated then
     break;
 end;
    Canvas.Draw(0,0,bm2);

 bm.Destroy;
end;


@!!ex   (2009-01-25 10:55:00) [20]

> [25] codemaster ©   (25.01.09 10:18)

ровно то, что я описал в [4]


Страницы:   1 2 3

Наверх

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