Плавный переход одного изображения в другое

Плавный переход одного изображения в другое

Плавный переход одного изображения в другое

Скачать в архиве (ZIP;317Kb);

  1. - DEMO.DESIGN (2:5032/7.32) -------------- DEMO.DESIGN -
  2. Msg : 1 из 59 Scn
  3. From : Lubarsky Oleg V. 2:5020/400 Срд 16 Июн 99 12:46
  4. To : All Чтв 17 Июн 99 00:46
  5. Subj : Re: Плавный переход одного изображения в другое.
  6. --------------------------------------------------------
  7. From: "Lubarsky Oleg V." <drlove@impuls.zhitomir.ua>
  8.  
  9. AlexMc пишет в сообщении <929442601@p122.f98.n5055.z2.ftn> ...
  10. А> В демах, (особенно на AMIGA) часто используется сабж.
  11. А> Пpичем эффект такой: одно изобpажение постепенно гаснет,
  12. А> а дpугое пpоявляется. Как сделать?
  13. Вариант 1:
  14. Линейно интерполировать каждую компоненту (R1,G1,B1) цвета пиксела,
  15. одного изображения, в соответстующие ему (R2,G2,B2) другого изображения,
  16. результат и тыкать на экран:
  17. R = R1 + k*(R2 - R1);
  18. G = G1 + k*(G2 - G1);
  19. B = B1 + k*(B2 - B1);
  20. 0 <= k <= 1
  21.  
  22. Вариант 2:
  23. Рисовать вторую картинку поверх второй с использованием альфа-канала,
  24. постепенно уменьшая прозрачность второго изображения.
  25. Что в принципе одно и тоже :)
  26. Bye!
  27. Best regards, respectfully yours <Dr.L0V>...
  28. --- ifmail v.2.14dev3
  29. * Origin: Unknown (2:5020/400)
  30.  

Download this code: twopic.txt


Угораздило меня прочитать это сообщение….ну не мог же я его оставить без внимания. Родилось вот это (TMTPAS):

twopic.pas

  1. program BLUR;
  2.  
  3. uses Crt,mVBE;
  4.  
  5. var Scr,Scr2 :Array[0..192000] of Byte; {Виртуальный видео-буффер}
  6. F :File;
  7. RSize,X :DWord;
  8.  
  9. Procedure Print2Buf(K:Word); {Копирование виртуального видео-буфера в реальный}
  10. var I,S:DWord;
  11. Begin
  12. { R=R1+k*(R2-R1); }
  13. { G=G1+k*(G2-G1); }
  14. { B=B1+k*(B2-B1); }
  15. { 0<=k<=1 }
  16. For I:=1 to 192000 do
  17. mem[VBE_VideoMem+I]:=Scr[I]+round(((Scr2[I]-Scr[I])*K) shr 8);
  18. End;
  19.  
  20. Begin
  21. {Инициалтзация 320x200x24}
  22. mVESAInit;If VesaError<>0 then mVesaErrorMessage;
  23. mInitVESAMode($410F);If VesaError<>0 then mVesaErrorMessage;
  24. mSetVESAMode($410F);If VesaError<>0 then mVesaErrorMessage;
  25. mSetVMemory;If VesaError<>0 then mVesaErrorMessage;
  26. {Чтение BMP'эхи}
  27. Assign(F,'april.bmp');
  28. Reset(F);
  29. Seek(F,54);
  30. BlockRead(F,Scr,192000,RSize);
  31. Close(F);
  32. {Чтение BMP'эхи}
  33. Assign(F,'february.bmp');
  34. Reset(F);
  35. Seek(F,54);
  36. BlockRead(F,Scr2,192000,RSize);
  37. Close(F);
  38. Print2Buf(1);
  39. ReadKey;
  40. X:=1;
  41. Repeat
  42. Print2Buf(X);
  43. X:=X+1;
  44. Until (Keypressed) or (X>255);
  45. ReadKey;
  46. mSetVGAMode;
  47. WriteLn(' ¦ Coded by Misha Krivij 1999');
  48. End.

Download this code: twopic.pas

mvbe.pas

  1. unit mVBE;
  2.  
  3. interface
  4.  
  5. uses DPMILib;
  6.  
  7. (* VBE info block structure *)
  8. type TVbeInfo = record
  9. VbeSignature : DWord;
  10. VbeVersion : Word;
  11. OemStringPtr : DWord;
  12. Capabilities : DWord;
  13. VideoModePtr : DWord;
  14. TotalMemory : Word;
  15. OEMSoftwareRev : Word;
  16. OEMVendorNamePtr : DWord;
  17. OEMProductNamePtr : DWord;
  18. OEMProductRevPtr : DWord;
  19. Reserved : array [0..221] of Byte;
  20. OEMData : array [0..255] of Byte;
  21. end;
  22.  
  23. TVbeModeInfo = record
  24. ModeAttributes : Word;
  25. WinAAttributes : Byte;
  26. WinBAttributes : Byte;
  27. WinGranularity : Word;
  28. WinSize : Word;
  29. WinASegment : Word;
  30. WinBSegment : Word;
  31. WinFuncPtr : Pointer;
  32. BytesPerScanLine : Word;
  33. XResolution : Word;
  34. YResolution : Word;
  35. XCharSize : Byte;
  36. YCharSize : Byte;
  37. NumberOfPlanes : Byte;
  38. BitsPerPixel : Byte;
  39. NumberOfBanks : Byte;
  40. MemoryModel : Byte;
  41. BankSize : Byte;
  42. NumberOfImagePages : Byte;
  43. Reserved : Byte;
  44. RedMaskSize : Byte;
  45. RedFieldPosition : Byte;
  46. GreenMaskSize : Byte;
  47. GreenFieldPosition : Byte;
  48. BlueMaskSize : Byte;
  49. BlueFieldPosition : Byte;
  50. RsvdMaskSize : Byte;
  51. RsvdFieldPosition : Byte;
  52. DirectColorModeInfo: Byte;
  53. PhysBasePtr : DWord;
  54. OffScreenMemOffset : DWord;
  55. OffScreenMemSize : Word;
  56. Reserved2 : Array [0..205] of Byte;
  57. end;
  58.  
  59. var VesaError :Byte;
  60. Regs :TRmRegs;
  61. VESAInfo :TVBEInfo;
  62. VESAModeInfo :TVBEModeInfo;
  63. VideoMem,VBE_VideoMem :DWord;
  64.  
  65. Procedure mVESAInit;
  66. Procedure mInitVESAMode(Mode:Word);
  67. Procedure mSetVESAMode(Mode:Word);
  68. Procedure mSetVGAMode;
  69. Function mPutVESAMode(X,Y,BPP:Word):Word;
  70. Procedure mVesaErrorMessage;
  71. Procedure mSetVMemory;
  72.  
  73. implementation
  74.  
  75. { Инициализация VESA }
  76. Procedure mVESAInit;
  77. Begin
  78. VesaError:=0;
  79. ClearRmRegs(Regs);
  80. Regs.AX:=$4F00;
  81. Regs.ES:=Buf_16;
  82. RealModeInt($10,Regs);
  83. Move(Pointer(Buf_32)^,VESAInfo,256);
  84. if (Regs.AX<>$004F) or (VESAInfo.VbeSignature<>$41534556) then VesaError=1;
  85. End;
  86.  
  87. { Инициализация графического режима VESA }
  88. Procedure mInitVESAMode(Mode:Word);
  89. Begin
  90. VesaError:=0;
  91. ClearRmRegs(Regs);
  92. Regs.ES:=Buf_16;
  93. Regs.ax:=$4F01;
  94. Regs.di:=$0000;
  95. Regs.cx:=Mode;
  96. RealModeInt($10,Regs);
  97. Move(Pointer(Buf_32)^,VESAModeInfo,256);
  98. if (Regs.AX<>$004F) or (VESAModeInfo.PhysBasePtr=0) then VESAError:=2;
  99. End;
  100.  
  101. { Установка графического режима VESA }
  102. Procedure mSetVESAMode(Mode:Word);
  103. Begin
  104. VesaError:=0;
  105. ClearRmRegs(Regs);
  106. Regs.AX:=$4F02;
  107. Regs.BX:=Mode;
  108. RealModeInt($10,Regs);
  109. if (Regs.AX<>$004F) then VESAError:=3;
  110. End;
  111.  
  112. { Установка стандартного режима EGA }
  113. Procedure mSetVGAMode;
  114. Begin
  115. ClearRmRegs(Regs);
  116. Regs.AX:=$0003;
  117. RealModeInt($10,Regs);
  118. End;
  119.  
  120. Function mPutVESAMode(X,Y,BPP:Word):Word;
  121. var M:Word;
  122. Begin
  123. For M:=$4100 to $4200 do
  124. Begin
  125. mInitVESAMode(M);
  126. If (VesaModeInfo.XResolution=X) and
  127. (VesaModeInfo.YResolution=Y) and
  128. (VesaModeInfo.BitsPerPixel=BPP) and
  129. (VesaError=0) then mPutVESAMode:=M;
  130. End;
  131. End;
  132.  
  133. { Вывод сообщения об ошибке }
  134. Procedure mVesaErrorMessage;
  135. Begin
  136. mSetVGAMode;
  137. WriteLn('VesaError:',VesaError);
  138. Halt(1);
  139. End;
  140.  
  141. { Узнаем логический адресс }
  142. Procedure mSetVMemory;
  143. var Tmp1,Tmp2 :Word;
  144. Begin
  145. Vbe_VideoMem:=MapPhysicalToLinear(VESAModeInfo.PhysBasePtr,4096*1024);
  146. If Vbe_VideoMem=0 then VESAError=4;
  147. VideoMem:=Vbe_VideoMem;
  148. End;
  149. end.

Download this code: mvbe.pas

Комментарии