سلام.
OpenGL برای فقط یک دوران ساده ارزش استفاده نداره چون یک مقدار مشکل هست و به نظرم GDI برای این کار خوبه.
تو GDI می تونید با تابع PlgBlt تصویر رو بچرخونید.
برای استفاده ازین تابع باید اشاره گری به سه تا مختصه دو تایی (میتونیم از TPoint استفاده کنیم) به تابع ارسال کنید. این ها سه نقطه در تصویر مقصد هستند که متناظرند با سه نقطه در تصویر منبع. نقطه ی بالا سمت چپ و نقطه ی بالا سمت راست و نقطه ی پایین سمت چپ در تصویر منبع. نقطه ی آخر رو خودش متناسب با این سه نقطه پیدا میکنه.
مثال تابع PlgBlt برای 90 درجه :
var p : array[0..2] of TPoint;
begin
p[0] := Point(0, b.Width);
p[1] := Point(0, 0);
p[2] := Point(b.Height, b.Width);
PlgBlt(b90.Canvas.Handle, p, b.Canvas.Handle, 0, 0, b.Width, b.Height, 0, 0, 0);
end;
مثال از یک تابع که با گرفتن زاویه و مرکز دوران و یک offset برای جابجایی و ضریب های بزرگ نمایی تصویر رو انتقال میده :
function RotateBitmap(
DstB, SrcB : TBitmap;
AngleDeg : Single;
RotCentX : Single = 0;
RotCentY : Single = 0;
OffsetX : Integer = 0;
OffsetY : Integer = 0;
ScaleX : Single = 1.0;
ScaleY : Single = 1.0):Boolean;
const PI_DIV_180 = 0.01745329251994329576923690768489;
var
p : array[0..2] of TPoint;
cos_, sin_, x, y : Extended;
begin
if ((DstB = nil) or (SrcB = nil)) then
begin
Result := False;
Exit;
end;
SineCosine(-AngleDeg * PI_DIV_180, sin_, cos_);
(*
rotation 2D
x = x` cos - y` sin
y = x` sin + y` cos
*)
x := ScaleX * -RotCentX;
y := ScaleY * -RotCentY;
p[0] := Point( Trunc(cos_ * x - sin_ * y + RotCentX) + OffsetX,
Trunc(sin_ * x + cos_ * y + RotCentY) + OffsetY);
x := ScaleX * (SrcB.Width - RotCentX);
y := ScaleY * -RotCentY;
p[1] := Point( Trunc(cos_ * x - sin_ * y + RotCentX) + OffsetX,
Trunc(sin_ * x + cos_ * y + RotCentY) + OffsetY);
x := ScaleX * -RotCentX;
y := ScaleY * (SrcB.Height - RotCentY);
p[2] := Point( Trunc(cos_ * x - sin_ * y + RotCentX) + OffsetX,
Trunc(sin_ * x + cos_ * y + RotCentY) + OffsetY);
Result := PlgBlt(
DstB.Canvas.Handle,
p,
SrcB.Canvas.Handle,
0, 0, SrcB.Width, SrcB.Height,
0, 0, 0);
end;
مثال استفاده با زاویه ی دلخواه و مرکز تصویر اول با بزرگنمایی افقی 1 و عمودی 2 :
RotateBitmap(b2, b1, angle, b.Width / 2.0, b.Height / 2.0, 0.0, 0.0, 1.0, 2.0);
مثال استفاده برای مشخصا 90 درجه :
RotateBitmap(b90, b, 90, 0.0, 0.0, 0, b.Width, 1.0, 1.0);