PDA

View Full Version : تغییر سایز تصاویر اپلود شده به یک سایز ثابت بدون دفرمه شدن



adameh_bahal
جمعه 01 آبان 1394, 22:49 عصر
با سلام
دوستان من باکس هایی که برای نمایش تصاویر در وبسایتم قرار دارم سایز ثابت 600 در 600 دارن و اجازه هم نمیدم کاربر عکس هایی کوچکتر از 600 در 600 آپلود کنه حالا میخوام عکس بدون دفرم شدن (نگه داشتن aspect ratio) با اندازه 600 در 600 ذخیره بشه مشکلی که وجود داره اینه که اگه 600 در 600 از عکس رو کراپ کنم اونوقت اگه عکس کاربر خیلی بزرگ باشه فقط یه بخش کوچیکیش ذخیره میشه اگرم از متدهایی که برای ریسایز هست استفاده کنم و aspectratio رو نگه دارم عرض یا طول عکس یه عددی متفاوت با 600 میشه چون aspectratio رو نگه داشتم
ممنون میشم راهنمایی کنید

am_al_59
شنبه 02 آبان 1394, 03:48 صبح
aspectratio نصبت طول و عرض تصویر به هم هست حالا شما اگر تصویرت طول و عرضش برابر نباشه سه تا راه داری
1- تصویر رو بدون تغییر اندازه ببری اما اگر تصویرت کوچکتر از ابعاد مورد نظر باشه نمی تونی از این روش استفاده کنی
2- تصویر رو بطور عادی تغییر بدی که در این حالت نسبت طول و عرض حفظ میشه اما اگر ابعاد برابر نباشه بزرگترینش میشه 600 کوچکترینش میشه یک چیز دیگه
3- تصویرتو ببینی طولش بیشتره یا عرضش ، همونکه بیشتره رو رو 600 تنظیم کنی و اون بعد دیگش که کم داره به مقدار لازم فضا بدی بهش مثل همون margin در ورد میشه که فکر کنم مناسب تره اینم کدش




double width = 600;
double height = 600;
Bitmap img = new Bitmap("d:\\abiBox.jpg");
double rx = width / img.Width;
double ry = height / img.Height;
double rto = rx < ry ? rx : ry;
Bitmap newImg = new Bitmap(Convert.ToInt32(width), Convert.ToInt32(height));
Graphics graphic = Graphics.FromImage(newImg);
graphic.Clear(Color.White);
graphic.DrawImage(img,
(int)((width - (img.Width * rto)) / 2),
(int)((height - (img.Height * rto)) / 2),
(float)(img.Width * rto),
(float)(img.Height * rto)
);
newImg.Save("d:\\a.jpg");





توی دستورات بالا نکتش فقط دستور زیره

graphic.Clear(Color.White);

این دستوره قبل از اینکه تصویر اصلیتو بکشی کل آبجک گرافیکتو با رنگ سفید پر میکنه و بعد از کشیدن تصویر اصلیت همون بعدی که کم داره سفید میمونه و ابعاد تصویرت میشه همون که میخوای

adameh_bahal
شنبه 02 آبان 1394, 09:52 صبح
ممنون دوست عزیز از راهنماییتون ولی اولا من به کاربر اجازه نمیدم عکسی که طول یا عرضش کوچکتر از 600 هست آپلود کنه و همینطور من نمیخوام جایی از عکس خالی (سفید) بمونه من میخوام دقیقا به همون اندازه 600 در 600 ذخیره بشه بدون اینکه دفرمه بشه و مشکلی هم ندارم که مقداری از عکس هم کراپ بشه ولی نمیخوام اگه کاربر عکس 2000 در 2000 آپلود کرد یه 600 در 600 ازش کراپ کنم که چیز خاصی از عکسش نمونه

am_al_59
شنبه 02 آبان 1394, 10:28 صبح
این شکلی بنویس

double width = 600;
double height = 600;
Bitmap img = new Bitmap("d:\\abiBox.jpg");
double rx = width / img.Width;
double ry = height / img.Height;
double rto = rx > ry ? rx : ry;
Bitmap newImg = new Bitmap(Convert.ToInt32(width), Convert.ToInt32(height));
Graphics graphic = Graphics.FromImage(newImg);
graphic.DrawImage(img, 0, 0,
img.Width < img.Height ? (float)width : (float)(img.Width * rto),
img.Height < img.Width ? (float)height : (float)(img.Height * rto));
newImg.Save("d:\\a.jpg");

adameh_bahal
شنبه 02 آبان 1394, 12:33 عصر
این هم کد وبی اش هست اگه کسی خواست استفاده کنه متنها این کراپش از وسط به اندازه مساوی هست نه از یک طرف:


using (var bitmap = new Bitmap(image.InputStream))
{
var width = bitmap.Width;
var height = bitmap.Height;


double widthRatio = (double)600 / width;
double heightRatio = (double)600 / height;
double ratio = widthRatio > heightRatio ? widthRatio : heightRatio;


var resizedWidth = width < height ? 600 : (int)(width * ratio);
var resizedHeight = height < width ? 600 : (int) (height * ratio);


var converter = new ImageConverter();
var image =
new WebImage((byte[])converter.ConvertTo(bitmap, typeof(byte[])))
.Resize(resizedWidth, resizedHeight)
.Crop((resizedHeight - 600) / 2, ((resizedWidth - 600 )/ 2), ((resizedHeight - 600) / 2), ((resizedWidth - 600) / 2));