Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Вниз

Плавный переход   Найти похожие ветки 

 
CodeMaster ©   (2009-01-23 22:40) [0]

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


 
KilkennyCat ©   (2009-01-23 23:24) [1]

Смотря что имеется ввиду. Если морфинг, то я - пас. На эту тему можно информации на хорошую книгу написать. Ну а если что-то типа эффекта FadeIn+FadeOut - это легко.


 
CodeMaster ©   (2009-01-24 12:10) [2]

Да мне как раз нужен морфинг


 
Михаил   (2009-01-24 13:39) [3]

ну яркость изображения уменьшай, а второго увеличивай вот и все


 
@!!ex ©   (2009-01-24 15:11) [4]

Color = Color1*(i-1)+Color2*i
где i от 0 до 1.


 
@!!ex ©   (2009-01-24 15:11) [5]

ой...
1-i


 
@!!ex ©   (2009-01-24 15:17) [6]

если это OpenGL или Direct3D, то можно делать это в шейдере, что будет быстро.
или две картинки рисовать с альфой. Тогда цвета трогать не надо.

Если делать на Кэнвасе, то и сканлайн не даст гигантской скорости.


 
KilkennyCat ©   (2009-01-24 15:52) [7]


> Михаил  


> @!!ex ©   (24.01.09 15:11) [4]

Это не морфинг.

морфинг - это, например, плавное изменение, перетакание круга в квадрат. Более-менее легко реализуется в векторной графике.


 
@!!ex ©   (2009-01-24 15:59) [8]

> [7] KilkennyCat ©   (24.01.09 15:52)

Ответил так, как понял. :)
Как только автор адекватно объяснет чего хочет, тогда по другому отвечу. :))


 
KilkennyCat ©   (2009-01-24 16:04) [9]


> @!!ex ©   (24.01.09 15:59) [8]

Дык он вроде и ответил на мое уточнение... как я понял :)


 
@!!ex ©   (2009-01-24 16:09) [10]

> [9] KilkennyCat ©   (24.01.09 16:04)

Если автор сам понимает, что значит слово морфинг. :))


 
CodeMaster ©   (2009-01-24 19:36) [11]

Эффект морфинга - плавное перетекание одного в другое


 
CodeMaster ©   (2009-01-24 19:36) [12]

Наверняка кто то видел такую реализация в AIMP. Меня интересует эта же реализация


 
KilkennyCat ©   (2009-01-24 22:11) [13]


> CodeMaster ©   (24.01.09 19:36) [12]

я не видел. я даже плохо помню, что это за прога... что-то типа мессенджера? Будет проще, если нарисуете пару-тойку картинок и покажете. Типа, исходная, промежуточная и конечная стадии.


 
CodeMaster ©   (2009-01-24 22:46) [14]

Вот посмотри мою реализацию она очень медленная.
http://www.wgteam.ucoz.kz/POGi4-Bugs.rar

P.S чтобы увидеть эффект наведите курсор на кнопку Play или на другие элементы управления.


 
KilkennyCat ©   (2009-01-24 22:50) [15]

посмотрю.. чуть позже, ночью. у меня на машине кроме виндов - ничего... даже архиватора нет.


 
KilkennyCat ©   (2009-01-24 23:18) [16]


> CodeMaster ©   (24.01.09 22:46) [14]

Приложению не удалось запуститься, поскольку MSVCP71.DLL не был найден


 
@!!ex ©   (2009-01-24 23:24) [17]

> [15] KilkennyCat ©   (24.01.09 22:50)

Вот я готов сто баксов поставить на то, что автор не то имеет ввиду под морфингом, что вы.
И кстати он тоже будет прав. Поскольку то что я описал - тоже морфинг.


 
antonn ©   (2009-01-24 23:30) [18]

в плеере fade


 
Anatoly Podgoretsky ©   (2009-01-24 23:30) [19]

@!!ex ©   (24.01.09 23:24) [17]
Это не морфинг


 
@!!ex ©   (2009-01-24 23:34) [20]

> [19] Anatoly Podgoretsky ©   (24.01.09 23:30)

определение морфинга из гугла: "преобразование одного объекта в другой"
А теперь расскажите почему то что я описал не подходит под это определение? Там вполне четко преобразуется один цвет в другое.


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

мда.


 
Anatoly Podgoretsky ©   (2009-01-25 00:24) [22]

> @!!ex  (24.01.2009 23:34:20)  [20]

преобразование формы


 
KilkennyCat ©   (2009-01-25 00:59) [23]

Оффтопом, но...
POG-iMP (Demo Beta 2) - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.

И это на чистой XP SP3 Proff.


 
@!!ex ©   (2009-01-25 07:44) [24]

> [23] KilkennyCat ©   (25.01.09 00:59)

Собрана она с дебаговыми внешними dll.


 
codemaster ©   (2009-01-25 10:18) [25]

Разобрался с проблемой MSVCP71.DLL.
Вот новая ссылка: http://www.wgteam.ucoz.kz/PMP4.rar


 
@!!ex ©   (2009-01-25 10:55) [26]

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

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


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

Алгоритм вот такой:
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;


 
CodeMaster ©   (2009-01-25 11:01) [28]

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


 
antonn ©   (2009-01-25 14:32) [29]

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


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


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

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


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


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

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


 
CodeMaster ©   (2009-01-25 15:42) [32]

Спасибо


 
antonn ©   (2009-01-25 15:51) [33]


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

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


 
CodeMaster ©   (2009-01-25 16:10) [34]

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;

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


 
KilkennyCat ©   (2009-01-25 16:14) [35]


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


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


 
KilkennyCat ©   (2009-01-25 16:17) [36]


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


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


 
CodeMaster ©   (2009-01-25 16:20) [37]

Как вот этот алгоритм в мою программу поставить.. ??
Подстроил под себя вот так
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;
И ничего не работает


 
antonn ©   (2009-01-25 16:22) [38]


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

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


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

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


 
CodeMaster ©   (2009-01-25 16:25) [39]

Intel Core 2 Duo 2.67 GHz 1333 FSB

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


 
antonn ©   (2009-01-25 16:29) [40]

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


 
CodeMaster ©   (2009-01-25 16:49) [41]

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


 
CodeMaster ©   (2009-01-25 16:50) [42]

Вот код на вхождение в кнопку:
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;


 
antonn ©   (2009-01-25 18:54) [43]

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

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

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


 
antonn ©   (2009-01-25 19:01) [44]

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


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

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.04 c
6-1200778609
VoV_I_K
2008-01-20 00:36
2009.03.15
Как передать событие из Jscript в приложение?


15-1231169901
@!!ex
2009-01-05 18:38
2009.03.15
Посоветуйте: какой винт покупать?


15-1231753699
NailMan
2009-01-12 12:48
2009.03.15
немного про свои сайты


3-1216156374
jane
2008-07-16 01:12
2009.03.15
метод Close для ADODataSet вызывает ошибку BOF или EOF имеет ...


8-1192181973
deswan
2007-10-12 13:39
2009.03.15
gif анимация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский