RSS订阅 | 匿名投稿
您的位置:网站首页 > 图像 > 正文

Delphi旋转位图

作者:admin 来源: 日期:2016/1/26 22:02:42 人气: 标签:

验证码识别之旋转位图

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上

读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址:
下一篇:没有资料