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上

相关阅读 >>

Delphi 窗体只显示控件

Delphi twebbrowser控件禁用鼠标右键

Delphi写的验证身份证号有效性函数

Delphi跨平台检测网络连接状态

Delphi 10 seattle中录制音频

Delphi提取二值图像轮廓

Delphi adoconnection连接 sqlserver

winapi 字符及字符串函数(10): lstrcpy - 复制字符串

Delphi firemonkey app 如何获得当前系统语言设置

Delphi解决dll注入桌面卡的问题

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...