View Full Version : کمک در چرخش دایره وار عکس
فرشته صحرا
یک شنبه 13 خرداد 1386, 13:18 عصر
من یه مشکلی برام پیش اومده. می خوام تو دلفی یه سری عکس به شکل دایره ای بچرخند. یعنی مثل یه دایره دور هم حرکت کنن. کسی می تونه برای این کار کمکم کنه؟
بد جوری گیر کردم.:گریه:
ali_abbasi22145
یک شنبه 13 خرداد 1386, 14:00 عصر
سلام
ImageEN استفاده کن و خیلی آسان است
reza.palang
یک شنبه 13 خرداد 1386, 14:53 عصر
اگه منظورت rotate دادن یک عکس هست اینه:
نمیدونم توی دلفی کامپوننتی برای این کار هست یا نه اما راه حل اینه:
اول باید pixelهای عکس رو دونه دونه بچرخونی که فرمولش اینه:
ch1=x+D *cos(k* pi/180)
ch2=y+D *sin(k* pi/180);x و y مختصات pixel عکس قبل از rotate هست.
k میزان چرخش مورد نظر است.
Pi عدد پی.
ch1 و ch2 مختصات جدید پیکسل است.
راستی D هم شعاع چرخش هست که برای هر pixel باید حساب بشه
Saeid59_m
یک شنبه 13 خرداد 1386, 14:55 عصر
وقتی پدر و مادرتون می گفتن بچه ریاضی بخون برای همچین روزی بود
با استفاده از توابع Sin و Cos و فرمول محیط دایره می تونی همچین کاری رو انجام بدی
اگه باز راهنمائی خواستی در خدمتم
Arman_1367
یک شنبه 13 خرداد 1386, 17:01 عصر
قبلاً از این برای برنامه ساعت آنالوگم که قابلیت پشتیبانی پوسته داشت استفاده کردم.
Procedure RotateImageByAngle(Var FRotated:TBitmap;FOriginal:Tbitmap;FColor:TColor;V alue:Integer;Center:TPoint);
const
MaxPixelCount = 32767;
Type
TArmanRGBTriple = packed record
rgbBlue: Byte;
rgbGreen: Byte;
rgbRed: Byte;
end;
PArmanRGBArray = ^TArmanRGBArray;
TArmanRGBArray = array [0..MaxPixelCount] of TArmanRGBTriple;
var
i, j, iRotationAxis, iOriginal, iPrime, iPrimeRotated: Integer;
jRotationAxis, jOriginal, jPrime, jPrimeRotated: Integer;
RowOriginal: PArmanRGBArray;
RowRotated: PArmanRGBArray;
Theta, SinTheta, CosTheta: Double;
R, G, B: Byte;
begin
FRotated.Width := FOriginal.Width;
FRotated.Height := FOriginal.Height;
FRotated.PixelFormat := pf24bit;
FOriginal.PixelFormat:=pf24bit;
iRotationAxis := Center.x;
jRotationAxis := Center.y;
Theta := -Value * Pi / 180;
SinTheta := Sin(Theta);
CosTheta := Cos(Theta);
B := FColor mod 256;
G := Round((FColor div 256) mod 256);
R := Round((FColor div 256) div 256);
for j := FRotated.Height - 1 downto 0 do
begin
RowRotated := FRotated.Scanline[j];
jPrime := 2 * (j - jRotationAxis) + 1;
for i := FRotated.Width - 1 downto 0 do
begin
iPrime := 2 * (i - iRotationAxis) + 1;
iPrimeRotated := Round(iPrime * CosTheta - jPrime * SinTheta);
jPrimeRotated := Round(iPrime * SinTheta + jPrime * CosTheta);
iOriginal := (iPrimeRotated - 1) div 2 + iRotationAxis;
jOriginal := (jPrimeRotated - 1) div 2 + jRotationAxis;
if (iOriginal >= 0) and (iOriginal <= FOriginal.Width - 1) and
(jOriginal >= 0) and (jOriginal <= FOriginal.Height - 1) then
begin
RowOriginal := FOriginal.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
end
else
begin
RowRotated[i].rgbBlue := B;
RowRotated[i].rgbGreen := G;
RowRotated[i].rgbRed := R
end;
end;
end;
end;
reza.palang
یک شنبه 13 خرداد 1386, 22:23 عصر
ولی من حدث(=حدس) میزنم که این دوستمون. rotate کردن عکس رو نمیخواد. میخواد یه عکس رو (مثلا یه thombnal) دور یک نقطه حرکت بده. نه اینکه Rotate بده. منتظر توضیحات بیشتر هستم. اما مثل اینکه خودش اصلا به موضوع علاقه نداره.
در هر صورت اگر هم اینطور باشه با کمی تغییرات توی همین فرمول میشه این یکی کار رو هم پیاده کرد.
Arman_1367
یک شنبه 13 خرداد 1386, 22:57 عصر
عزیزم اگر منظورتان را درست فهمیده باشم یعنی تصویر از جایی خارج از خود بچرخد.
خوب مثال زیر را با همان تابع امتحان کن:
Var Buf:TBitmap;
buf2:TBitmap;
begin
Buf:=TBitmap.Create;
Buf.Width:=5*Image1.Width;
Buf.Height:=5*Image1.Height;
Buf2:=TBitmap.Create;
buf.Canvas.Draw((buf.Width-Image1.Width)div 2,(Buf.Height-Image1.Height)div 2,image1.Picture.Bitmap);
RotateImageByAngle(Buf2,buf,clWhite,45,point((buf. Width+Image1.Width)div 2 +5 ,(Buf.Height+Image1.Height)div 2+5));
Image2.Picture.Assign(Buf);
Image3.Picture.Assign(Buf2);
buf.Free;
buf2.Free;
end;
آیا منظور شما همین بود.
فرشته صحرا
چهارشنبه 16 خرداد 1386, 08:11 صبح
ممنون از توضیحات همتون. آقا رضا من شدیدا دنبال جوابم. وقت نشد که سر بزنم. چون این چند روز دانشگاه تعطیل بود و نمیذاشتن از خوابگاه بیرون بریم. اینه دیگه!!
برای توضیح هم این که مثل اینکه می خوایم چند تا عکس رو روی محیط دایره ای بچرخونیم.
من این رو می خواستم.
از کمکهاتون ممنونم. حتما استفاده میکنم. بازم اگه چیزی به فکرتون رسید به منم بگید. ممنون از همه.
Arman_1367
چهارشنبه 16 خرداد 1386, 12:07 عصر
سلام اگه یه نگاه کوچولو کرده بودی سوالت رو تکرار نمی کردی.:عصبانی:
دو تا TImage و یدونه TButton رو فرمت قرار بده یک عکس را روی Image1 باز کن و در رویداد دکمه این کد را بنویس :
Var Buf1,Buf2:Tbitmap;
Radius:Integer;//شعاع دایره
Center:TPoint;//مرکز دایره
Angle:Integer;//زاویه چرخش
begin
Buf1:=TBitmap.Create;
Buf1.Width:=5*Image1.Width;
Buf1.Height:=5*Image1.Height;
Buf2:=TBitmap.Create;
Center:=Point(Buf1.Width div 2,Buf1.Height div 2);
Radius:=50;
Buf1.Canvas.Draw((Buf1.Width)div 2+Radius,(Buf1.Height-Image1.Height)div 2,
Image1.Picture.Bitmap);
//رسم دایره
With Buf1.Canvas do
begin
Pen.Mode:=pmNotXor;
Brush.Style:=bsClear;
Ellipse((Buf1.Width div 2)-Radius,(Buf1.Height div 2)-Radius,(
Buf1.Width div 2)+Radius,(Buf1.Height div 2)+Radius);
PenPos:=Center;
LineTo(Center.X+Radius,Center.Y);
end;
Angle:=120;
RotateImageByAngle(Buf2,Buf1,clWhite,Angle,Center) ;
With Buf2.Canvas do
begin
Pen.Mode:=pmNotXor;
PenPos:=Center;
LineTo(Center.X+Radius,Center.Y);
end;
Image2.Picture.Assign(Buf2);
Buf1.Free;
Buf2.Free;
//این تغییر اندازه در واقع محاسباتی بود برای آنکه تصویر از بیتمپ خارج نشود
//مرکز و شعاع هم هر جور دلت خاست تغییر بده
end;
کد تابع رو هم به این صورت بزار:
Procedure RotateImageByAngle(Var FRotated:TBitmap;FOriginal:Tbitmap;FColor:TColor;V alue:Integer;Center:TPoint);
const
MaxPixelCount = 32767;
Type
TArmanRGBTriple = packed record
rgbBlue: Byte;
rgbGreen: Byte;
rgbRed: Byte;
end;
PArmanRGBArray = ^TArmanRGBArray;
TArmanRGBArray = array [0..MaxPixelCount] of TArmanRGBTriple;
var
i, j, iRotationAxis, iOriginal, iPrime, iPrimeRotated: Integer;
jRotationAxis, jOriginal, jPrime, jPrimeRotated: Integer;
RowOriginal: PArmanRGBArray;
RowRotated: PArmanRGBArray;
Theta, SinTheta, CosTheta: Double;
R, G, B: Byte;
begin
FRotated.Width := FOriginal.Width;
FRotated.Height := FOriginal.Height;
FRotated.PixelFormat := pf24bit;
FOriginal.PixelFormat:=pf24bit;
iRotationAxis := Center.x;
jRotationAxis := Center.y;
Theta := Value * Pi / 180;
SinTheta := Sin(Theta);
CosTheta := Cos(Theta);
B := FColor mod 256;
G := Round((FColor div 256) mod 256);
R := Round((FColor div 256) div 256);
for j := FRotated.Height - 1 downto 0 do
begin
RowRotated := FRotated.Scanline[j];
jPrime := 2 * (j - jRotationAxis) + 1;
for i := FRotated.Width - 1 downto 0 do
begin
iPrime := 2 * (i - iRotationAxis) + 1;
iPrimeRotated := Round(iPrime * CosTheta - jPrime * SinTheta);
jPrimeRotated := Round(iPrime * SinTheta + jPrime * CosTheta);
iOriginal := (iPrimeRotated - 1) div 2 + iRotationAxis;
jOriginal := (jPrimeRotated - 1) div 2 + jRotationAxis;
if (iOriginal >= 0) and (iOriginal <= FOriginal.Width - 1) and
(jOriginal >= 0) and (jOriginal <= FOriginal.Height - 1) then
begin
RowOriginal := FOriginal.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
end
else
begin
RowRotated[i].rgbBlue := B;
RowRotated[i].rgbGreen := G;
RowRotated[i].rgbRed := R
end;
end;
end;
end;
دی دی با همان تابع RotateImageAbyAngle این کار را کردم عین آب خوردن فقط برای اینکه چشم همه ببینه چی شده یک دایره و زاویه رو هم رسم کردن.با پوزش منظوری نبود.
در ضمن شما اگر خواستید کد اینکه چگونه تصویر را موجی وار به دور دایره چرخوند را هم بزارم.
فقط خواهشاً مثل من نباشید قبل از اینکه خواستید چیزی بنویسید یکم روش تمرکز کنید ببینید پاسخی نداده باشند.
فرشته صحرا
چهارشنبه 16 خرداد 1386, 13:13 عصر
آقا آرمان ممنون از جوابتون. چرا عصبانی شدید؟:گریه: خودتون پرسیدید که منظور من چی بوده. منم کاملتر توضیح دادم. از اینکه ناراحتتون کردم عذر می خوام:خجالت: . راستش اون موقع وقت کافی برای نگاه کردن نداشتم. چون داشتن سایت رو میبستن. الان دیگه کامل کامل نگاه کردم. مرسی . خیلی کامله.:تشویق:
Arman_1367
چهارشنبه 16 خرداد 1386, 14:01 عصر
اختیار دارید من به این راحتی ناراحت یا عصبانی نمی شوم. اگر هم با لحن بدی متن را نوشتم شما بزرگواری کنید من را ببخشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.