<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      WINDOWS基于調色板的圖像消隱

      [摘要]圖像漸隱在Windows的多媒體程序設計中是一種常用的技術,主要用來制作程序片頭或者多幅圖像之間的切換等。利用圖像漸隱技術可以使程序具有動畫效果,從而增添程序的魅力。圖像漸隱實現的方法很多,例如利用調色板以及利用光柵映射模式等,而調色板方法無疑是其中最快速的一種。需要指出的是,這種方法只能在基于調...
          圖像漸隱在Windows的多媒體程序設計中是一種常用的技術,主要用來制作程序片頭或者多幅圖像之間的切換等。利用圖像漸隱技術可以使程序具有動畫效果,從而增添程序的魅力。
      圖像漸隱實現的方法很多,例如利用調色板以及利用光柵映射模式等,而調色板方法無疑是其中最快速的一種。需要指出的是,這種方法只能在基于調色板的顯示模式下工作。在Windows的顯示模式中,只有256色模式是基于調色板的,這種模式是多媒體程序經常采用的。
          在基于調色板的256色模式下,當一幅圖像顯示時,Windows把圖像的邏輯調色板載入,并通過調色板映射把邏輯調色板映射到系統調色板,圖像的每一像素的顯示顏色都映射自系統調色板的一個顏色索引值,每個索引對應一個24位的RGB全彩色值。當系統調色板改變時,當前引用系統調色板的窗口的像素顏色也隨之改變,而這種改變是系統在硬件刷屏中自動完成的,速度極快,這樣就為我們利用調色板實現圖像的動畫漸隱提供了引擎。實際上,利用這種技術可以實現多種動畫效果,圖像漸隱只是其中的一種。
          在下面的例子中,首先在窗口的黑色背景上顯示一幅256色的DIB圖像,然后在系統時鐘消息進程中動態地修改圖像的邏輯調色板的顏色值,使每一個顏色值逐漸向背景顏色值趨近,漸隱的速度可以用時鐘的時間片間隔來控制。當漸隱開始時,可以看到整幅圖像逐漸變暗,最后消失在黑色的背景中,整個過程十分平滑,就如你在電影片頭中看到的一樣。
      本例用Delphi 1.0在Windows 3.2下實現,下面給出程序的主要部分及注釋。

      unit Bmp-Disaper;
      interface
      uses
      SysUtils,WinTypes,WinProcs,Messages,Classes,Graphics,Controls,Forms,Dialogs,Ex
      tCtrls,StdCtrls;
      type
      TForm1=class(TForm)
      Image1:TImage;{顯示漸隱圖像}
      Timer1:TTimer;{時鐘構件}
      Panel1:TPanel;{顯示漸隱過程,已漸隱為背景色的顏色數}
      Button1:TButton;{開始漸隱按鈕}
      procedure Timer1 Timer(Sender:TObject);{始終控制過程}
      procedure Button1 Click (Sender:TObject);{激發漸隱過程}
      procedure FormCreate (Sender:TObject);{窗體構造過程}
      private
      PalDevice:Imteger;{調色板模式標志}
      go:integer;{漸隱開始標志}
      pal:arrar[0...255] of TPaletteEntry;{邏輯調色板}
      end;
      var
      Form1:TForm1;

      implementation
      {$R *.DFM}
      procedure TForm1.Timer1Timer(Sender:TObject);
      var
      i,n:integer;
      begin
      if go=1 then{開始漸隱}
      begin
      for i:=0 to 255 do{調色板顏色值遞減}
      begin

      pal[i].peFlags:=PC-RESERVED;{調色板動畫標志,一定得這樣設置}
      if pal[i].peRed>0 thenpal[i].peRed:=pal[i].peRed-1;
      if pal[i].peGreen>0 thenpal[i].peGreen:=pal[i].peGreen-1;
      if pal[i].peBlue>0 thenpal[i].peBlue:=pal[i].peBlue-1;
      end;
      SetPaletteEntries(Image1.Picture.Bitmap.Palette,0,256,pal);
      {設置新的顏色到DIB調色板}
      RealizePalette(Image1.Picture.Bitmap.Canvas.Handle);
      {影射邏輯調色板到系統硬件調色板}
      {計算已經漸隱消失的顏色數,如全數完成則終止漸隱過程,令go=0}
      n:=0;
      for i:=0 to 255 do
      if(pal[i].peRed=0) and (pal[i].peGreen=0) and (pal[i].peBlue=0)
      then
      n:=n+1
      if n=256 then
      begin
      Panel1.Caption:=’OK’;
      go:=0;
      end
      else
      Panel1.Caption:=’n=’+IntToStr(n);
      end;
      end;
      procedure TForm1.Button1Click(Sender:TObject);
      begin
      GetPaletteEntries(Image1.Pictrue.Bitmap.Palette,0,256,pal);
      {獲得DIB圖像的調色板}
      {判斷系統是否是基于調色板的顯示模式,如果是則開始漸隱過程}
      PalDevice:=GetDeviceCaps(Canvas.Handle,RASTERCAPS) and RC-PALETTE;
      if(PalDevice>0) the go:=1;
      end;
      procedure TForm1.FormCreate(Sender:TObject);
      begin
      Image1.Pictrue.Bitmap.LoadFromFile(’c:\video10\ts.bmp’);
      {加載DIB圖像}
      end;
      end.


      日韩精品一区二区三区高清