PDA

View Full Version : تغییر اندازه تصویر هنگام ذخیره سازی



xsbehx
جمعه 29 خرداد 1394, 10:20 صبح
سلام
من می خوام وقتی مدیر یک تصویری رو ذخیره کرد. بصورت خودکار یک تصویر کوجیک دیگه با اندازه مثلا 50 * 50 هم کنارش ذخیره شه.
اینکارو برای این می خوام که مثلا من می خوام اون تصویر رو تو صفحه اصلی نشون بدم. و نیازی نیست تصویر بزرگ رو با حجم زیاد تو صفحه نمایش بدم.
می یام و اون تصویر کوچیکه رو که خودش بصورت اتوماتیک ساخته رو بجاش می زارم تو صفحه اصلی
تصیور اصلی با اندازه و حجم بالا رو هم می زارم تو پست مربوط به خودش.
تا اینطوری الکی صفحه اصلی من با تصویر با حجم و اندازه بالا سنگین نشه

malloc
جمعه 29 خرداد 1394, 10:54 صبح
public string CreateThumbnail(int maxWidth, int maxHeight, string path)
{

var image = System.Drawing.Image.FromFile(path);
var ratioX = (double)maxWidth / image.Width;
var ratioY = (double)maxHeight / image.Height;
var ratio = Math.Min(ratioX, ratioY);
var newWidth = (int)(image.Width * ratio);
var newHeight = (int)(image.Height * ratio);
var newImage = new Bitmap(newWidth, newHeight);
Graphics thumbGraph = Graphics.FromImage(newImage);

thumbGraph.CompositingQuality = CompositingQuality.HighQuality;
thumbGraph.SmoothingMode = SmoothingMode.HighQuality;
//thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;

thumbGraph.DrawImage(image, 0, 0, newWidth, newHeight);
image.Dispose();

string fileRelativePath = "newsizeimages/" + maxWidth + Path.GetFileName(path);
newImage.Save(Server.MapPath(fileRelativePath), newImage.RawFormat);
return fileRelativePath;
}

xsbehx
جمعه 29 خرداد 1394, 11:10 صبح
تصویر خروجی رو کیفیتش رو هم می شه تنظیم کرد؟

malloc
جمعه 29 خرداد 1394, 11:21 صبح
با دو خط زیر میتونی ... اما دیگه 50 در 50 کیفیت نداره که بزن بره

thumbGraph.CompositingQuality = CompositingQuality.HighQuality; thumbGraph.SmoothingMode = SmoothingMode.HighQuality;

xsbehx
پنج شنبه 18 تیر 1394, 16:35 عصر
یکم کد مورد نظر رو تغییردادم شد این:


public void CreateThumbnail(string MainImagePath, float ImageWidthSize, float ImageHeightSize)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(MainImagePath);
float imgWidth = image.PhysicalDimension.Width;
float imgHeight = image.PhysicalDimension.Height;
float imgScale;
//اگر هم عرض و هم ارتفاع عکس وارد شود، تغییر اندازه بر اساس اندازه ورودی خواهد بود
if (ImageHeightSize != 0.0 && ImageWidthSize != 0.0)
{

}
//اگر فقط ارتفاع عکس وارد شود، تغییر اندازه بر اساس ارتفاع خواهد بود
//و عرض عکس بصورت خودکار و با حفظ تناسب تغییر خواهد کرد
else if (ImageHeightSize != 0.0 && ImageWidthSize == 0.0)
{
imgScale = imgHeight /ImageHeightSize;
ImageHeightSize = imgHeight / imgScale;
ImageWidthSize = imgWidth / imgScale;
}
//اگر فقط عرض عکس وارد شود، تغییر اندازه بر اساس عرض خواهد بود
//و ارتفاع عکس بصورت خودکار و با حفظ تناسب تغییر خواهد کرد
else if (ImageHeightSize == 0.0 && ImageWidthSize != 0.0)
{
imgScale = imgWidth / ImageWidthSize;
ImageHeightSize = imgHeight / imgScale;
ImageWidthSize = imgWidth / imgScale;
}
var newImage = new Bitmap((int)(ImageWidthSize), (int)(ImageHeightSize));
Graphics thumbGraph = Graphics.FromImage(newImage);
thumbGraph.CompositingQuality = CompositingQuality.HighQuality;
thumbGraph.SmoothingMode = SmoothingMode.HighQuality;
thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
thumbGraph.DrawImage(image, 0, 0, (int)(ImageWidthSize), (int)(ImageHeightSize));
image.Dispose();

//Path.GetDirectoryName(MainImagePath)
//اگر به این متد مسیر یک فایل داده شود، نام فایل و پسوند ان را حذف می کند و باقی را برمی گرداند

//Path.GetFileNameWithoutExtension(MainImagePath)
//اگر به این متد مسیر یک فایل داده شود، تمام مسیر را حذف کرده و فقط نام فایل ان هم بدون پسوند ان را بر می گرداند

//Path.GetExtension(MainImagePath)
//اگر مسیر یک فایل را به این متد بدهیم، پسوند ان فایل را برای ما بر می گرداند
if (Path.GetExtension(MainImagePath) == ".jpg" || Path.GetExtension(MainImagePath) == ".jpeg")
{
newImage.Save(Path.GetDirectoryName(MainImagePath) + "/" + Path.GetFileNameWithoutExtension(MainImagePath) + "_thumb" + Path.GetExtension(MainImagePath), System.Drawing.Imaging.ImageFormat.Jpeg);
}
else if (Path.GetExtension(MainImagePath) == ".png")
{
newImage.Save(Path.GetDirectoryName(MainImagePath) + "/" + Path.GetFileNameWithoutExtension(MainImagePath) + "_thumb" + Path.GetExtension(MainImagePath), System.Drawing.Imaging.ImageFormat.Png);
}
else if (Path.GetExtension(MainImagePath) == ".bmp")
{
newImage.Save(Path.GetDirectoryName(MainImagePath) + "/" + Path.GetFileNameWithoutExtension(MainImagePath) + "_thumb" + Path.GetExtension(MainImagePath), System.Drawing.Imaging.ImageFormat.Bmp);
}
}


این هم برای اجرا

CreateThumbnail(MapPath("~/Managment/Images/Image0.jpg"), 0, 300);

وقتی اندازه تصویر کوچیک می شه، کیفیت تصویر خیلی پایین می یاد.
راهی هست که بازهم بشه کیفیت فایل خروجی رو بهتر کرد؟