PDA

View Full Version : تناسب بین سایز تصویر و image



nassim_20
شنبه 29 تیر 1387, 15:54 عصر
من یه image دارم که از اندازه ای نباید بزرگتر باشد در واقع در یه کادر میباشد
می خواهم تصاویرم رو در اون view کنم اما تصاویرم یه اندازه نیستند و اگر خاصیت strach رو فعال کنم تصویر دفرمه میشه
حالا چطور باید این تناسب رو ایجاد کنم که اگر تصویر از image بزرگتر بود اولا لازم نباشه image اونقدر بزرگ کنم که از کادرم بیرون بزند دوما تصویر بطور کامل و سالم در image دیده بشه

Hsimple11
شنبه 29 تیر 1387, 16:14 عصر
از متد StretchDraw استفاده کنید اگر رضایت بخش نبود بفرمایید.


Image1.Canvas.StretchDraw(Image1.Canvas.ClipRect, MyPic);

MyPic را از OpenPictureDialog یا ... لود میکنید.

vcldeveloper
شنبه 29 تیر 1387, 16:32 عصر
می خواهم تصاویرم رو در اون view کنم اما تصاویرم یه اندازه نیستند و اگر خاصیت strach رو فعال کنم تصویر دفرمه میشه
علاوه بر خصوصیت Stretch، خصوصیات Proportional و Center را هم True کنید.

nassim_20
شنبه 29 تیر 1387, 16:37 عصر
ظاهرا فقط در مورد تصاویر bitmap عمل می کند من کد رو بصورت زیر نوشتم ولی ارور داد:


Image1.Canvas.StretchDraw(Image1.Canvas.ClipRect,I mage2.Picture.Graphic );

ارور:
con only modify an image if it contains a bitmap
کد رو بصورت تغییر دادم باز هم همون ارور رو میده:

Image1.Canvas.StretchDraw(Image1.Canvas.ClipRect,I mage2.Picture.Bitmap);

vcldeveloper
شنبه 29 تیر 1387, 16:56 عصر
ظاهرا فقط در مورد تصاویر bitmap عمل می کند من کد رو بصورت زیر نوشتم ولی ارور داد
StretchDraw اگر روی فرمت های غیر Bitmap هم کار می کرد، مشکل شما را حل نمی کرد، چون تناسب تصویر را حفظ نمی کند. راه حل مشکل شما همون خصوصیت Proportional هست.

Hsimple11
شنبه 29 تیر 1387, 19:43 عصر
مشکلی با JPEG که نداشت ولی بله تناسب را حفظ نمی کند.
این کد را ببینید امتحانش نکردم.


procedure CreateThumbnail(jpBig, jpSmall: TJpegImage; NewWidth, NewHeight: Integer);
var
BmpBig, BmpSmall: TBitmap;
begin
// Create the temp bitmaps.
BmpBig := TBitmap.Create;
BmpSmall := TBitmap.Create;

// Assign the "big" bitmap to the "big" JPEG.
BmpBig.Assign(jpBig);

// Create the "small" bitmap.
BmpSmall.Width := NewWidth;
BmpSmall.Height := NewHeight;
StretchBlt(BmpSmall.Canvas.Handle, 0, 0, NewWidth, NewHeight, BmpBig.Canvas.Handle, 0, 0, jpBig.Width, jpBig.Height, SRCCOPY);

// Assign the "small" JPEG to the "small" bitmap.
jpSmall.Assign(BmpSmall);

// Free the temp bitmaps.
BmpBig.Free;
BmpSmall.Free;
end;

////////////////////////////////////////

Now here's how you call the procedure (using your button's onclick event):

procedure TForm1.Button1Click(Sender: TObject);
var
jpBig, jpSmall: TJPegImage;
begin
jpBig := TJPegImage.Create;
jpSmall := TJPegImage.Create;
if opendialog1.execute then
jpBig.LoadFromFile(opendialog1.filename);

CreateThumbnail(jpBig, jpSmall, round(jpBig.width / 2), round(jpBig.height/ 2));

jpSmall.SaveToFile('c:\Test2.jpg');

jpSmall.Free;
jpBig.Free;
end;

Hsimple11
شنبه 29 تیر 1387, 19:44 عصر
یک Thumbnail با اندازه های کوچکتر میسازد.

اصغر (پآچ)
شنبه 29 تیر 1387, 20:45 عصر
سلام دوست من

ببین بهترین راه اینه که بیای اندازه ی عکس خودت رو بگیری و اون رو طوری تغییر بدی که عکست بدون اینکه دفرمه بشه توی Image قرار بگیره یه کد دارم که خودم نوشتم برات میزارم امیدوارم که کارت رو راه بندازه

روش کار:
اول یه TscrollBox روی فرمت بذار و اسمشو من گذاشتم ContainImage بعد یه Image روی اون قرار بده بعد یه دکمه هم قرار بده که عکست رو بتونی بین اندازه واقعی و فیت شده تغییر بدی حالا کد زیر رو توی دکمه بنویس


if BitBtn8.Caption = 'بزرگنمایی' then begin
Image2.Stretch := False;
Image2.AutoSize := True;
Image2.Align := alNone;
Image2.SetBounds(0, 0, 0, 0,);
ComboBox1.Visible := True;
Label2.Visible := True;
BitBtn8.Caption := ' تصویر کشیده';
BitBtn8.Glyph := Image1.Picture.Bitmap;
BitBtn7.Left := 365;
BitBtn8.Left := 500;
ComboBox1.ItemIndex := 0;
Image2.SetBounds(0, 0, 0, 0);
ComboBox1Click(Self);
end else begin
ComboBox1.Visible := False;
Edit1.Visible := False;
Label2.Visible := False;
Image2.SetBounds(0, 0, 0, 0,);
FitPicture(Self);
BitBtn8.Caption := بزرگنمایی';
BitBtn8.Glyph := Image3.Picture.Bitmap;
BitBtn7.Left := 265;
BitBtn8.Left := 400;
end;


بعد یه پروسیجر تعریف کن به نام FitPicture و کد زیر رو توش قرار بده



procedure TForm1.FitPicture(Sender: TObject);
var
Zoom: Extended;
begin
Image2.AutoSize := False;
Image2.Stretch := True;
if Image2.Picture.Height > Image2.Picture.Width then begin
Zoom := ContainImage.Height / Image2.Picture.Height;
Image2.Width := Floor(Image2.Picture.Width * Zoom);
Image2.Height := ContainImage.Height;
Image2.Left := (ContainImage.Width - Image2.Width) div 2;
end else begin
Zoom := ContainImage.Width / Image2.Picture.Width;
Image2.Height := Floor(Image2.Picture.Height * Zoom);
Image2.Width := ContainImage.Width;
Image2.Top := (ContainImage.Height - Image2.Height) div 2;
end;
end;


حالا اگه دوست داشتی زوم با مقدار دلخواه داشته باشی می تونی از یک ComboBox استفاده کنی (من سه تا آیتم براش گذاشتم زوم دلخواه، کشیدگی هماهنگ با عرض تصویر و کشیدگی هماهنگ با طول تصویر:

و کد زیر رو توی رویداد OnClick کمبو باکس بنویس:


var
Zoom: Extended;
begin
case ComboBox1.ItemIndex of
0: begin
Edit1.Visible := True;
Edit1.Text := '100';
Edit1.SetFocus;
Edit1.SelectAll;
ZoomChange(Self);
end;
1: begin
Edit1.Visible := False;
Image2.AutoSize := False;
Image2.Stretch := True;
Image2.Align := alTop;
Image2.Align := alNone;
Zoom := ContainImage.Width / Image2.Picture.Width;
Image2.Height := Floor(Image2.Picture.Height * Zoom);
end;
2: begin
Edit1.Visible := False;
Image2.AutoSize := False;
Image2.Stretch := True;
Image2.Align := alLeft;
Image2.Align := alNone;
Zoom := ContainImage.Height / Image2.Picture.Height;
Image2.Width := Floor(Image2.Picture.Width * Zoom);
end;
end;
end;


یه Edit هم روی فرمت بذار که بتونی با استفاده از اون مقدار زوم رو در حالت زوم دلخواه (آیتم یک کمبوباکس) تعیین کنی.

امیدوارم بدردت بخوره راستی اگه خواستی بگو کد پیمایش (جابجایی) روی عکس هم برات بذارم که تو حالات زوم بتونی روی عکست پیمایش داشته باشی
موفق و موید باشی