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 webbrowser 加载html 将html代码转换成网页

Delphi中利用中断获得系统启动以来的时间

Delphi 如何将颜色值转换为html格式?

Delphi 查找指定目录,指定扩展名的所有文件名

Delphi 保证当前程序显示在最前

Delphi xmldocument控件之xml

Delphi实现屏幕抓图

Delphi application.restore不起作用了,该如何处理

Delphi查找特定的exe是否在运行

md5.pas

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



打赏

取消

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

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

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

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

评论

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