从鼠标光标下的像素获取alpha通道值

时间:2012-04-12 18:29:59

标签: delphi gdi+

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

我试过这个,但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;

2 个答案:

答案 0 :(得分:2)

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

在基本级别,您在监视器上看到的每个像素都没有透明度。

即。想象一下,点击 Print Scrn ,然后将桌面副本粘贴到Paint中。您将找不到任何部分透明的像素,因为没有。至少你会看到壁纸的像素。

对不起,不好意思。

答案 1 :(得分:0)

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

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let client = MSClient()
    }
}

使用此图像或具有Alpha透明度的任何其他图像。

An image to use