PDA

View Full Version : چرخوندن یک تصویر؟



امیر-نا
شنبه 31 مرداد 1383, 12:45 عصر
چه جوری میشه یه تصویری رو بچرخونیم هم در جهت عقربه ساعت و هم در خلاف اون.
یه راه دارم منتها خیلی کنده و برای تصاویر بزرگ درست طول میکشه.

اگه راهی یا کامژوننتی معرفی کنین ممنون میشم


امیر

SReza1
شنبه 31 مرداد 1383, 17:39 عصر
این برای چرخش به راست!! واسه چرخش به چپ خودت بنویس! نتونستی بگو دوباره تا بفرستم



procedure turnRight(src, dst: Tbitmap);
var w,h,x,y:integer;
ps,pd:pbytearray;
begin
h:=src.Height;
w:=src.width;
src.PixelFormat :=pf24bit;
dst.PixelFormat :=pf24bit;
dst.Height :=w;
dst.Width :=h;
for y:=0 to h-1 do begin
ps:=src.ScanLine [y];
for x:=0 to w-1 do begin
pd:=dst.ScanLine [x];
pd[(h-1-y)*3]:=ps[x*3];
pd[(h-1-y)*3+1]:=ps[x*3+1];
pd[(h-1-y)*3+2]:=ps[x*3+2];
end;
end;
end;

Sepidar
شنبه 31 مرداد 1383, 21:31 عصر
به نظر میرسه راه حلش استفاده از ماتریسهای دوران باشه. برای توضیحات بیشتر ر.ک. کتب درباره جبر خطی.

سید یه توضیح در مورد کدت میدی؟

امیر-نا
یک شنبه 01 شهریور 1383, 00:36 صبح
با سلام
ممنون از اینکه زحمت کشیدین

بهتره منظورم رو درست تر مطرح کنم اونم اینکه من می خام با فشار دادن یک کلید به مدتی یک تصویر
به صورتی که در هر تقریبا یک ثانیه یک درجه به سمت راست بره -وبا فشار دادن یک کلید دیگه به سمت عکس همین عمل ذو تکرار کنه؟


ممنون امیر

SReza1
یک شنبه 01 شهریور 1383, 18:34 عصر
به نظر میرسه راه حلش استفاده از ماتریسهای دوران باشه. برای توضیحات بیشتر ر.ک. کتب درباره جبر خطی.

سید یه توضیح در مورد کدت میدی؟

نمیدونم با تابع scanline این شی کار کردی یا نه!این تایع تمام مشخصات بک خط رو میخونه و در اون آرایه میریزه! بعد روی image بعدی پردازش به صوزت عمودی کار میکنه!!
چیزه جالبیه! اگه توضیح بیشتر میخواهی بگو دقیق تر میگم!


و اما دوست بعدی مون!! بابا این کد که کاری نداره اضافه کنی!! دوتا bitmap کاری نداره که!! :shock: :?

امیر-نا
دوشنبه 02 شهریور 1383, 15:02 عصر
با سلام


و اما دوست بعدی مون!! بابا این کد که کاری نداره اضافه کنی!! دوتا bitmap کاری نداره که!!
میشه یه توضیحی بدین ممنون میشم

ara_prg
سه شنبه 03 شهریور 1383, 08:42 صبح
دوست عزیز نیاز به هیچ کار خاصی نداری زیرا با استفاده از دستور plgblt ویندوز به راحتی می توانی این کار را انجام دهی (آن هم با سرعت بسیار زیاد) :wink:

امیر-نا
سه شنبه 03 شهریور 1383, 13:19 عصر
هر چی که Help دلفی رو خوندم نفهمیدم ؟؟؟؟؟؟؟؟؟
می شه یه مثال بزنین؟

SalarSoft
سه شنبه 03 شهریور 1383, 13:30 عصر
این کامپوننت رو از سایت Torry.net پیدا کردم!
البته هنوز تستش نکردم. خودتون زحمت بکشین! :)

ara_prg
سه شنبه 03 شهریور 1383, 18:11 عصر
خوب من اینجا یک function ایجاد کردم که با دادن تصویر و زاویه دوران تصویر را برایت دوران بدهد. توجه کن که این تابع می تواند تصویر را با بهترین کیفیت تغییر سایز نیز بدهد. در تابع محلی را که برای تغییر سایز می توانی استفاده کنی مشخص کرده ام.





type
Po = array[1..3] of TPoint;


procedure RotateImage(Pic:TBitmap; RAngle:Integer);
var
BaseP : Po;
DestP : ^Po;

procedure ReadyDestP;
var Ang,CN,SN : Extended;
CN1,SN1,L,Ox,Oy,P1X,P1Y,P2X,P2Y,P3X,P3Y : Extended;
begin
Ang := RAngle * PI / 180;
CN := Cos(Ang); SN := Sin(Ang);

OX := BaseP[2].x/2; Oy := BaseP[3].y /2;
L := Sqrt(Sqr(OX)+SQr(OY));
CN1 := OX/L; SN1:=OY/L;

P1X := OX-L*(CN1*CN+SN1*SN); P1Y := OY-L*(SN1*CN-CN1*SN);
P2X := OX+L*(CN1*CN-SN1*SN); P2Y := OY-L*(SN1*CN+CN1*SN);
P3X := OX-L*(CN1*CN-SN1*SN); P3Y := OY+L*(SN1*CN+CN1*SN);

DestP^[1].x := Round(P1x);
DestP^[1].y := Round(P1y);
DestP^[2].x := Round(P2x);
DestP^[2].y := Round(P2Y);
DestP^[3].x := Round(P3X);
DestP^[3].y := Round(P3y);
end; { ReadyDestP }


begin
BaseP[1].X:=0; BaseP[1].Y:=0;
BaseP[2].X:=Pic.Width; BaseP[2].Y:=0;
BaseP[3].X:=0; BaseP[3].Y:=Pic.Height;


New(DestP);

Bm := TBitmap.Create;
Bm.Width:=0; Bm.Height:=0;
Bm.Width:=Pic.Width; Bm.Height:=Pic.Height; // change Width and Height to resize image

ReadyDestP;

SetStretchBltMode(BM.Canvas.Handle,STRETCH_HALFTON E); //optional -- use for better quality OR remove for better performance
PlgBlt( Bm.Canvas.Handle,
DestP^,
Pic.Canvas.Handle,
0,
0,
Pic.Width,
Pic.Height,
0,
0,
0);

Bm.Free;

Dispose(DestP);
end; { RotateImage }


امیدوارم که کار ساز باشد :wink:

امیر-نا
سه شنبه 03 شهریور 1383, 23:08 عصر
ممنون فقط یه سوال ؟
bm
رو باید از نوع Tbitmap تعریف کنیم؟


باز هم متشکرم

ara_prg
چهارشنبه 04 شهریور 1383, 08:24 صبح
بله باید از نوع TBitmap باشد. یعنی بصورت زیر کد تغییر می کند





[b]var Bm:Tbitmap;[/b]begin
BaseP[1].X:=0; BaseP[1].Y:=0;
BaseP[2].X:=Pic.Width; BaseP[2].Y:=0;
BaseP[3].X:=0; BaseP[3].Y:=Pic.Height;


New(DestP);

Bm := TBitmap.Create;




حالا ببین بدرد می خورد یا خیر :wink:

ara_prg
چهارشنبه 04 شهریور 1383, 08:28 صبح
فقط خواستم بگم اشتباه نکنی چون من می خواستم قسمت جدید کد را Bold کنم اما به این شکل در آمد. فقط باید در بالای Begin اصلی تابع بنویسی



var Bm : TBitmap;