📄 ugraphicutil.~pas
字号:
//****************************************************
//功能描述:图像处理函数
//创建日期: 2006-8-25
//author: Qinc
//****************************************************
unit UGraphicUtil;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
jpeg, ExtCtrls, StdCtrls,Math,Forms;
type
TGraphicUtil = class
private
public
class procedure Rotate(Srcbmp, DestBmp: Tbitmap; angle: extended);
class procedure Zoom(Srcbmp, DestBmp: Tbitmap; zoomScale: extended);
class procedure Rotate90(Srcbmp, DestBmp: Tbitmap);
class procedure Rotate180(Srcbmp, DestBmp: Tbitmap);
class procedure Rotate270(Srcbmp, DestBmp: Tbitmap);
class function BmpToJpeg(bmp:TBitmap;scale:TJPEGQualityRange):TJPEGImage;
class function JPGToBmp(jpg:TJPEGImage):TBitmap;
end;
implementation
{ TGraphicUtil }
//***********************************************************
//功能:任意角度旋转
//参数:Srcbmp:源位图 DestBmp:目标位图 ;angle旋转角度
//返回值:无
class procedure TGraphicUtil.Rotate(Srcbmp, DestBmp: Tbitmap;
angle: extended);
var
c1x, c1y, c2x, c2y: integer;
p1x, p1y, p2x, p2y: integer;
radius, n: integer;
alpha: extended;
c0, c1, c2, c3: tcolor;
begin
if SrcBmp.Width > SrcBmp.Height then
begin
DestBmp.width := SrcBmp.Width;
DestBmp.height := SrcBmp.Width;
end
else
DestBmp.Width := SrcBmp.Height;
DestBmp.Height := SrcBmp.Height;
//将角度转换为PI值
angle := (angle / 180) * pi;
// 计算中心点,你可以修改它
c1x := SrcBmp.width div 2;
c1y := SrcBmp.height div 2;
c2x := DestBmp.width div 2;
c2y := DestBmp.height div 2;
// 步骤数值number
if c2x < c2y then
n := c2y
else
n := c2x;
dec(n, 1);
// 开始旋转
for p2x := 0 to n do
begin
for p2y := 0 to n do
begin
if p2x = 0 then
alpha := pi / 2
else
alpha := arctan2(p2y, p2x);
radius := round(sqrt((p2x * p2x) + (p2y * p2y)));
p1x := round(radius * cos(angle + alpha));
p1y := round(radius * sin(angle + alpha));
c0 := SrcBmp.canvas.pixels[c1x + p1x, c1y + p1y];
c1 := SrcBmp.canvas.pixels[c1x - p1x, c1y - p1y];
c2 := SrcBmp.canvas.pixels[c1x + p1y, c1y - p1x];
c3 := SrcBmp.canvas.pixels[c1x - p1y, c1y + p1x];
DestBmp.Canvas.pixels[c2x + p2x, c2y + p2y] := c0;
DestBmp.canvas.pixels[c2x - p2x, c2y - p2y] := c1;
DestBmp.canvas.pixels[c2x + p2y, c2y - p2x] := c2;
DestBmp.canvas.pixels[c2x - p2y, c2y + p2x] := c3;
end;
application.processmessages
end;
end;
//***********************************************************
//***********************************************************
//功能:缩放位图
//参数:Srcbmp:源位图 DestBmp:目标位图 ;zoomScale缩放比例
//返回值:无
class procedure TGraphicUtil.Zoom(Srcbmp, DestBmp: Tbitmap;
zoomScale: extended);
begin
DestBmp.Width := Trunc(zoomScale * Srcbmp.Width);
DestBmp.Height := Trunc(zoomScale * Srcbmp.Height);
SetStretchBltMode(DestBmp.Canvas.Handle,HALFTONE);
StretchBlt(DestBmp.Canvas.Handle,0,0,DestBmp.Width,DestBmp.Height,
Srcbmp.Canvas.Handle,0,0,Srcbmp.Width,Srcbmp.Height,SRCCOPY);
DestBmp.PixelFormat := pf24bit;
end;
//***********************************************************
class procedure TGraphicUtil.Rotate180(Srcbmp, DestBmp: Tbitmap);
begin
end;
class procedure TGraphicUtil.Rotate270(Srcbmp, DestBmp: Tbitmap);
begin
end;
class procedure TGraphicUtil.Rotate90(Srcbmp, DestBmp: Tbitmap);
begin
end;
//***********************************************************
//功能:bmp转换为JPG
//参数:
//返回值:无
class function TGraphicUtil.BmpToJpeg(bmp:TBitmap;scale:TJPEGQualityRange):TJPEGImage;
begin
Result := nil;
if Assigned(bmp) then
begin
Result := TJPEGImage.Create;
Result.Assign(bmp);
Result.PixelFormat := jf24Bit;
Result.CompressionQuality := scale;
Result.JPEGNeeded;
Result.Compress;
end;
end;
//***********************************************************
//***********************************************************
//功能:Jpg转换为bmp
//参数:
//返回值:无
class function TGraphicUtil.JPGToBmp(jpg: TJPEGImage): TBitmap;
begin
Result := nil;
if Assigned(Jpg) then
begin
Result := TBitmap.Create;
jpg.DIBNeeded;
Result.Assign(jpg);
end;
end;
//***********************************************************
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -