上一篇:Delphi访问网页中的下拉菜单
下一篇:中值滤波 - 转帖

Delphi旋转位图 - 转贴

发布于: 2012/12/26 8:05:11   |  发布在: 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上


旋转位图