在圖片播放程序中,有時需要在有背景圖像的前提下播放圖片,並在播放過程中實現特效,如百葉窗、馬賽克等,這就需要我們播放的位圖的底色是透明的。如何讓我們的位圖低色變透明呢,如果僅僅設置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;