Delphi旋转位图


验证码识别之旋转位图

1. 函数

//  Bitmaps  must  be  24  bit  pixel  format.
//  Angle  is  in  degrees.
function  RotateBitmap(Bitmap:  TBitmap;  Angle:  Double;  Color:  TColor):  TBitmap;
const
 MaxPixelCount  =  32768;
type
 PRGBTripleArray  =  ^TRGBTripleArray;
 TRGBTripleArray  =  array[0..MaxPixelCount]  of  TRGBTriple;
var
 CosTheta:  Extended;
 SinTheta:  Extended;
 xSrc,  ySrc:  Integer;
 xDst,  yDst:  Integer;
 xODst,  yODst:  Integer;
 xOSrc,  yOSrc:  Integer;
 xPrime,  yPrime:  Integer;
 srcRow,  dstRow:  PRGBTripleArray;
begin
 Result  :=  TBitmap.Create;
 SinCos(Angle  *  Pi  /  180,  SinTheta,  CosTheta);
 if  (SinTheta  *  CosTheta)  <  0  then
 begin
 Result.Width  :=  Round(Abs(Bitmap.Width  *  CosTheta  -  Bitmap.Height  *  SinTheta));
 Result.Height  :=  Round(Abs(Bitmap.Width  *  SinTheta  -  Bitmap.Height  *  CosTheta));
 end
 else
 begin
 Result.Width  :=  Round(Abs(Bitmap.Width  *  CosTheta  +  Bitmap.Height  *  SinTheta));
 Result.Height  :=  Round(Abs(Bitmap.Width  *  SinTheta  +  Bitmap.Height  *  CosTheta));
 end;
 with  Result.Canvas  do
 begin
 Brush.Color  :=  Color;
 Brush.Style  :=  bsSolid;
 FillRect(ClipRect);
 end;
 Result.PixelFormat  :=  pf24bit;
 Bitmap.PixelFormat  :=  pf24bit;
 xODst  :=  Result.Width  div  2;
 yODst  :=  Result.Height  div  2;
 xOSrc  :=  Bitmap.Width  div  2;
 yOSrc  :=  Bitmap.Height  div  2;
 for  ySrc  :=  Max(Bitmap.Height,  Result.Height)-1  downto  0  do
 begin
 yPrime  :=  ySrc  -  yODst;
 for  xSrc  :=  Max(Bitmap.Width,  Result.Width)-1  downto  0  do
 begin
 xPrime  :=  xSrc  -  xODst;
 xDst  :=  Round(xPrime  *  CosTheta  -  yPrime  *  SinTheta)  +  xOSrc;
 yDst  :=  Round(xPrime  *  SinTheta  +  yPrime  *  CosTheta)  +  yOSrc;
 if  (yDst  >=  0)  and  (yDst  <  Bitmap.Height)  and
 (xDst  >=  0)  and  (xDst  <  Bitmap.Width)  and
 (ySrc  >=  0)  and  (ySrc  <  Result.Height)  and
 (xSrc  >=  0)  and  (xSrc  <  Result.Width)  then
 begin
 srcRow  :=  Bitmap.ScanLine[yDst];
 dstRow  :=  Result.Scanline[ySrc];
 dstRow[xSrc]  :=  srcRow[xDst];
 end;
 end;
 end;
end;

2. 调用例子:




Image2.Picture.Assign(RotateBitmap(Image1.Picture.Bitmap, 30, clWhite));


//将Image1的位图旋转30度后显示在Image2上

联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678