2012-04-12 124 views
2

如何在TImage中使用GDIPlus与Delphi 2010获取鼠标光标下像素的alpha值?从鼠标光标下的像素获取alphachannel值

我试过这个,但A总是255?我做错了什么?

procedure TFormMain.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); 
var 
    GPBitmap: TGPBitmap; 
    iColorRef: Cardinal; 
    iColor: TColor; 
    A, R, G, B: Byte; 
    iARGB: ARGB; 
begin 

    if Assigned (Image1.Picture) then 
    begin 

     GPBitmap := TGPBitmap.Create (Image1.Picture.Bitmap.Handle); 
     try 

     // Get alpha 0-255 from GPBitmap 
     GPBitmap.GetPixel (X, Y, iColorRef); 
     iARGB := ColorRefToARGB (iColorRef); 
     A := GetAlpha (iARGB); 
     AlphaUnderCursor1.Caption := 'Alpha: ' + IntToStr (A); 

     iColor := Image1.Canvas.Pixels [ X, Y ]; 
     GetRGB (iColor, R, G, B); 
     Shape1.Brush.Color := iColor; 

     finally 
     GPBitmap.Free; 
     end; 

end; 
+0

好的...做到了,但结果相同。 iStatus:= GPBitmap.GetPixel(X,Y,iColorRef); iStatus = InvalidParameter? – Bill 2012-04-12 19:00:45

+2

也许没有透明度,alpha是真的255? – 2012-04-12 19:10:34

+0

不。我画了10 px线与可见的alpha颜色,然后将鼠标移到画出的线....绘制的线alpha颜色似乎是至少在视觉上是正确的。 – Bill 2012-04-12 19:14:15

回答

2

问题是显示器上的图像没有透明度。

在基本水平上,每像素你在显示器上看到没有透明度。

即想象击中打印Scrn,并将桌面的副本粘贴到Paint中。你不会找到任何部分透明的像素,因为没有。至少你会看到你的壁纸的像素。

对不起。

0

你可以试试这个。秘诀是创建一个 相同图像的后缓冲PNG图像,并从屏幕图像的 鼠标移动事件读取该通道。以下代码显示了如何实现此目的。

type 
    TForm16 = class(TForm) 
    Image1 : TImage; //Load SomeFile.png 
    StatusBar1: TStatusBar; 
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    PNGImage1 : TPNGImage; //Load SomeFile.png into this as well 
    public 
    { Public declarations } 
    end; 

var 
    Form16: TForm16; 

implementation 

{$R *.dfm} 

procedure TForm16.FormCreate(Sender : TObject); 
    begin 
    PNGImage1 := TPNGImage.Create(); 
    PNGImage1.Assign(Image1.Picture); //Assign SomeFile.png 
    end; 

procedure TForm16.FormDestroy(Sender : TObject); 
    begin 
    PNGImage1.Free(); 
    end; 

procedure TForm16.Image1MouseMove(Sender : TObject; Shift : ShiftState; X, Y : Integer); 
    var 
    Alpha: PByte; 
    begin 
    Alpha := @PNGImage1.AlphaScanline[Y]^[X]; 

     if(Alpha^ > 0) then 
      Image1.Cursor := crDrag 
     else 
      Image1.Cursor := crDefault; 

    Statusbar1.Panels[0].Text := IntToStr(Alpha^); 
    end; 

end. 

使用此图像或任何其他图像与Alpha透明度。

An image to use