程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 建立透明底色的位圖

建立透明底色的位圖

編輯:Delphi

    在圖片播放程序中,有時需要在有背景圖像的前提下播放圖片,並在播放過程中實現特效,如百葉窗、馬賽克等,這就需要我們播放的位圖的底色是透明的。如何讓我們的位圖低色變透明呢,如果僅僅設置image組件的Transparent的屬性為True的話會怎樣?我們知道Image組件設置透明後左下角的那個坐標點為透明色,記坐標點為(0,image1.height-1),如果我們僅僅是將一個位圖(設為位圖1)將Bush的刷新顏色定義為透明色後實現位圖全部刷新,即bush.color:= image1.canvas.Pixels[0,image1.height-1],再將另一個位圖(設為位圖2)讀取圖片後,按比例以縮略圖的方式通過Copyrect方法復制到位圖1上,然後再通過Image1組件顯示在界面上,這樣我們會發現位圖的底色是透明了,但在不應該透明的圖片上會出現一些區域,這些區域也是透明的。為什麼會出現這樣的問題呢?原因是這樣的,把位圖1的某一種顏色設置成透明色後,他會遍歷整個位圖的所有坐標點,只要是與透明色相同的顏色,那麼就會被設置成透明,這樣在圖片中一些與位圖透明色相同的顏色也被設置成透明了,這也就是我們看到圖片上出現一些透明的區域。

  那麼如何實現縮略圖背景的透明呢,在這裡我想了一種方法,供大家參考,就是首先將創建三個位圖,我們不妨設為位圖1、位圖2、位圖3,位圖1、位圖2設置大小相同,將位圖2用透明色刷新整個區域後,用Copyrect方法復制到位圖1,然後再將位圖3讀取圖片後,按長寬比例以縮略圖的方式用Copyrect方法復制到位圖1,之後再將位圖1用Copyrect方法復制到Image1.canvas,這樣我們在界面上看到的圖片正常,而沒被圖片覆蓋的地方呈透明色。

  具體代碼如下:

  Var

   Jpeg:TJpegimage

   jb,imageb:real;

   newbmp1,newbmp2,newbmp3: TBitmap;

   jw,jg,bmpheight,bmpwidth:integer;

   TransColor:Tcolor;

  begin

   image1.Align:=alClIEnt;//設置iamge1的覆蓋區域

   Jpeg:=TJpegimage.Create;

   Newbmp1:= TBitmap.Create;

   Newbmp2:= TBitmap.Create;

   Newbmp3:= TBitmap.Create;

   Jpeg.LoadFromFile(File.Name);//讀取Jpeg為擴展名的圖片

   imageb:=image.Width/image.Height;

   newbmp1.Assign(Jpeg);//將擴展名為Jpeg的圖片轉換為位圖

   jw:=newbmp1.Width;

   jg:=newbmp1.Height;

   jb:=jW/jg;

   newbmp2.Width:=image1.Width;

   newbmp2.Height:=image1.Height;

   newbmp3.Width:=image1.Width;

   newbmp3.Height:=image1.Height;//設置newbmp2,newbmp3的區域相同

   newbmp3.Canvas.Brush.Color:=TransColor;

   newbmp3.canvas.brush.style:=bssolid;

   newbmp3.Canvas.FillRect(rect(-1,-1,image1.Width,image1.Height));

   newbmp3.Transparent:=true;

   newbmp3.TransparentColor:=TransColor;//將newbmp3設置為透明

   newbmp2.Canvas.CopyRect(rect(0,0,image1.Width,image1.Height),newbmp3.Canvas,rect(0,0,newbmp3.Width,newbmp3.Height));//將newbmp3復制到newbmp2中

   if jb>=imageb then

  newbmp2.Canvas.CopyRect(rect(0,round(image1.Height/2)-round(image1.width/jb/2),image1.Width,round(image1.Height/2)-round(image1.width/jb/2)+round(image1.width/jb)),newbmp1.Canvas,rect(0,0,newbmp1.Width,newbmp1.Height));

   if jb
  newbmp2.Canvas.CopyRect(rect(round(image1.Width/2)-round(image1.Height*jb/2),0,round(image1.Width/2)-round(image1.Height*jb/2)+round(image1.Height*jb),image1.Height),newbmp1.Canvas,rect(0,0,newbmp1.Width,newbmp1.Height));

  //按比例將newbmp1復制到newbmp2中

   image2.Canvas.Draw(0,0,newbmp2);//將newbmp2畫到image2中

   Jpeg1.Free;

   Newbmp1.free;

   Newbmp2.Free;

   Newbmp3.Free;

   end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved