如何实现图片的半透明???急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1(50分)

  • 主题发起人 主题发起人 爱delphi
  • 开始时间 开始时间

爱delphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个窗体上放了两个image控件,(image1和image2),我把image1当成背景图片,image2是前景,image2是个小图片,上面是一些尺寸,我想把它变成半透明状态以便能可以看到背景图像,不知道那位可们能不能实现呀?最好可以用一个trackbar控件控制透明度!!!!
 
两个图片计算啊。
 
图片格式!小心有的图片格式是不可以搞透明的,JPEG就不可以。
 
function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
begin
with Result do
begin
rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
rgbReserved := 0;
end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
var
BMP:TBitmap;
x,y:integer;
FRect:TRect;
FDst,FSrc:TRGBQuad;
begin
BMP:=TBitmap.Create;
BMP.Width:=ImgTemp.Width;
BMP.Height:=ImgTemp.Height;

FRect.Left:=0;FRect.Top:=0;
FRect.Right:=BMP.Width; FRect.Bottom:=BMP.Height;
//如果是JPEG需要对JPEG进行转换,
//BMP.Canvas.CopyRect(Rect(0,0,BMP.Width,BMP.Height),Image2.Canvas,Rect(0,0,BMP.Width,BMP.Height));
for x:=0 to BMP.Width do
for y:=0 to BMP.Height do
begin
FDst:=RGBQUAD(ImgBg.Picture.Bitmap.Canvas.Pixels[x,y]);
FSrc:=RGBQUAD(ImgTemp.Picture.Bitmap.Canvas.Pixels[x,y]);
FDst:=ComposeColor(FDst,FSrc,TrackBar1.Position);
BMP.Canvas.Pixels[x,y]:=RGB(FDst.rgbBlue,FDst.rgbGreen,FDst.rgbRed);
end;
DstImg.Canvas.CopyRect(FRect,BMP.Canvas,FRect);
BMP.Free;
end;

end.
 
Procedure BlendBmp(BkGround, FrGround:TBitmap;Left,Top,Alpha:Integer);
var
X, Y: Integer;
PB, PF: PbyteArray;
R1, R2, G1, G2, B1, B2: Integer;
Begin
BkGround.PixelFormat := pf24bit;
FrGround.PixelFormat := pf24bit;
For Y := Top to BkGround.Height - 1 do
Begin
IF Y - Top > FrGround.Height - 1 then Break;
PB := BkGround.ScanLine[Y];
PF := FrGround.ScanLine[Y-Top];
For X:=Left to BkGround.Width-1 do
Begin
IF X-Left > FrGround.Width-1 then Continue;
B1 := PB[X*3];
G1 := PB[X*3+1];
R1 := PB[X*3+2];
B2 := PF[(X-left)*3];
G2 := PF[(X-left)*3+1];
R2 := PF[(X-left)*3+2];
PB[X*3] := (B2*Alpha+B1*(255-Alpha)) div 255;
PB[X*3+1] := (G2*Alpha+G1*(255-Alpha)) div 255;
PB[X*3+2] := (R2*Alpha+R1*(255-Alpha)) div 255;
End;
End;
End;


Alpha值255为100%
 
怎么没有人回答了呀,我的问题已解决了,谢谢各位的参与,我还有一个问题是关于图片的裁切的,我有两个图片控件,一个是bigimg一个是smallimg,smallimg控件在bigimg上,可是怎么把这个smallimg图片给裁切下来,不用鼠标操作,我用canvas.copyrec来编写可是裁切下来只是原来图片的一部分怎么回事呀,下面是我的原吗:newbmp.Canvas.CopyRect(Rect(0,0,smallimg.width,smallimg.height),bigimg.Canvas,Rect(0,0,smallimg.width,smallimg.height));
newbmp.savetofile('c:/ewe.bmp');
//其中newbmp是我又申请的一个bmp类,
问题是为什么裁切出来 的是一部分呀,帮帮忙吧,我快急死了呀!!!!
 
你要剪切smallimg还是bigimg,上段程序剪切的是bigimg.
剪切smallimg
newbmp.Canvas.CopyRect(Rect(0,0,smallimg.width,smallimg.height),smallimg.Canvas,Rect(0,0,smallimg.width,smallimg.height));
 
怎么一个问题解决了,不结贴,还要问第二个问题(你是不是没得分了哈)
[?][?][?]
 
哥,能不能说的不要那么直接呀!!!你不知道我没有钱呀!!!!!我现在还有几个想问可没有分了,!!!!!!!!!!!!!!1111[:(!]
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, jpeg, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
TrackBar1: TTrackBar;
Timer1: TTimer;
procedure TrackBar1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
self.AlphaBlendValue:=self.TrackBar1.Max-self.TrackBar1.Position;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
self.AlphaBlend:=true;

self.TrackBar1.Min:=0;

self.TrackBar1.Max:=255;

self.TrackBar1.Frequency:=25;


end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
self.TrackBar1.Position:=self.TrackBar1.Position+20;

end;

end.
 
Image1: TImage;
TrackBar1: TTrackBar;
Timer1: TTimer
用这三个控件
而且要把form属性Aplablend变为True
 
我是想在一个大图像上裁切一个和它上面那个小图片一样大小的图像区域,也就是说裁切出来的是那个大图像的一部分,它的大小和它上面那个小图片是一样大的呀,不知我这样说大家是不明明白呀?如果用newbmp.Canvas.CopyRect(Rect(0,0,smallimg.width,smallimg.height),bigimg.Canvas,Rect(0,0,smallimg.width,smallimg.height)); 裁切出来的中是从那个bigimg(大图像)的左上角为起点的一个图像区域,问题是怎么在bigimg(大图像)上裁切出就smallimg(小图像)的左上角为基准的一个区域呀?? 如果不这样的话,无论把那个smallimg(小图像)放到那去程序始终裁切的是从大图像左上角开始的,而我那个小图像是个标尺图片.说白了就是把那个小图片下面的那块图像区域全部给裁切出来!这怎么实现呀!!!!???[?][?]
 
把小图像的座标求得,如(X,Y)=(10,100)

newbmp.Canvas.CopyRect(Rect(0,0,smallimg.width,smallimg.height),bigimg.Canvas,Rect(10,100,smallimg.width+10,smallimg.height+100))
 
哦,真是高手呀,你说的(X,Y)=(10,100)
是小图片的左上角的坐标吗?那怎么把裁砌出来的图片保存下来呀,能不能给点demo code呀!!!!
 
newbmp.savetofile('1.bmp');
 
im1放在FORM1上,im2放在FORM2上,FORM2渐变透明后不就可以看到IM1了吗,就是定位有点麻烦,可以要用到鼠标移动事件
 
图像裁切用: BitBlt
 
路过.顺便问一下,两个IMAGE是可以实现透明,如果两个BMP呢.有没有办法将第一个BMP以透明的方式放在第二个BMP上.如问题解决了.可以开贴给分.............
 
后退
顶部