想取其中的不是黑色的部分做为一个区域保存:
unit _getrgn;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtDlgs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1 : TImage;
btnOpen : TButton;
btnSave : TButton;
OpenPicDlg1 : TOpenPictureDialog;
SaveDlg1: TSaveDialog;
procedure btnSaveClick(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function ysGetWindowRgn( Bmp :TBitmap; TransColor :TColor ): HRGN;
procedure ysSaveRgnToFile( Rgn :HRGN; SaveName :String );
var
Form1: TForm1;
implementation
{$R *.DFM}
function ysGetWindowRgn( Bmp :TBitmap; TransColor :TColor ): HRGN;
var
x,
y,
w,
h,
BeginPos,
EndPos : Integer;
Rgn1,
Rgn2 : HRGN;
begin
Rgn1 :=0;
Rgn2 :=0;
w :=Bmp.Width;
h :=Bmp.Height;
Result :=0;
for y :=0 to h -1 do
begin
x :=0;
EndPos :=0;
repeat
BeginPos :=x;
Inc( x );
while ( Bmp.Canvas.Pixels[x,y] <> TransColor ) and ( x <=w ) do
begin
Bmp.Canvas.Pixels[x,y] :=clBlue;
Inc( x );
end;
EndPos :=x;
if BeginPos <> w then
begin
if EndPos =w then Dec( EndPos );
if Rgn1 =0 then
Rgn1 :=CreateRectRgn( BeginPos +1, y, EndPos, y +1 )
else
begin
Rgn2 :=CreateRectRgn( BeginPos +1, y, EndPos, y +1 );
if Rgn2 <>0 then CombineRgn( Rgn1, Rgn1, Rgn2, RGN_OR );
DeleteObject( Rgn2 );
end;
end;
until x >= w -1;
end; // for 'for y :=0 to h -1 do...'
Result :=Rgn1;
end;
procedure ysSaveRgnToFile( Rgn :HRGN; SaveName :String );
var
RgnSize : Integer;
RgnData : pRGNDATA;
fm : TFileStream;
begin
try
fm :=TFileStream.Create( SaveName, fmCreate or fmShareDenyWrite );
except
ShowMessage( 'Error in create file ' +SaveName );
Exit;
end;
RgnSize :=GetRegionData( Rgn, 0, nil );
GetMem( RgnData, RgnSize );
GetRegionData( Rgn, RgnSize, RgnData );
fm.Write( RgnSize, Sizeof( RgnSize ) );
fm.Write( RgnData^, RgnSize );
FreeMem( RgnData, RgnSize );
fm.Free;
end;
procedure TForm1.btnSaveClick(Sender: TObject);
var
Rgn : HRGN;
begin
btnSave.Enabled :=false;
if SaveDlg1.Execute then
begin
Rgn :=ysGetWindowRgn( Image1.Picture.Bitmap,
Image1.Picture.Bitmap.Canvas.Pixels[1,1]
);
if Rgn <>0 then
ysSaveRgnToFile( Rgn, SaveDlg1.FileName )
else ShowMessage( 'Error in create window region.' );
end;
btnSave.Enabled :=true;
end;
procedure TForm1.btnOpenClick(Sender: TObject);
begin
if OpenPicDlg1.Execute then
Image1.Picture.LoadFromFile( OpenPicDlg1.FileName );
end;
end.
窗体:
object Form1: TForm1
Left = 192
Top = 107
AutoScroll = False
Caption = 'Form1'
ClientHeight = 169
ClientWidth = 407
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
Scaled = False
PixelsPerInch = 96
TextHeight = 13
object Image1: TImage
Left = 16
Top = 16
Width = 128
Height = 128
AutoSize = True
end
object btnOpen: TButton
Left = 240
Top = 16
Width = 75
Height = 25
Caption = '&Open'
TabOrder = 0
OnClick = btnOpenClick
end
object btnSave: TButton
Left = 240
Top = 112
Width = 75
Height = 25
Caption = '&Save'
TabOrder = 1
OnClick = btnSaveClick
end
object OpenPicDlg1: TOpenPictureDialog
DefaultExt = '.bmp'
Filter =
'All (*.bmp;*.ico)|*.bmp;*.ico|Bitmaps (*.bmp)|*.bmp|Icons (*.ico' +
')|*.ico'
Left = 160
Top = 16
end
object SaveDlg1: TSaveDialog
DefaultExt = '.rgn'
Filter = 'Yafeisoft region file(*.rgn)|*.rgn'
Left = 160
Top = 48
end
end