2

Delphi 2010でGDIPlusを使用して、TImageのマウスカーソルの下のピクセルからアルファ値を取得するにはどうすればよいですか?

私はこれを試しましたが、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;
4

2 に答える 2

2

問題は、モニター上の画像に透明度がないことです。

基本的なレベルでは、モニターに表示されるすべてのピクセルには透明度がありません。

Print Scrnつまり、 を押して、デスクトップのコピーをペイントに貼り付けることを想像してみてください。部分的に透明なピクセルは存在しないため、検出されません。少なくとも、壁紙のピクセルが表示されます。

ご不便をおかけして申し訳ありません。

于 2012-05-08T21:19:31.580 に答える
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.

この画像またはアルファ透明度を持つ他の画像を使用します。

使うイメージ

于 2016-07-17T06:33:31.810 に答える