PDA

View Full Version : سوال: بهترین روش فشرده سازی تصاویر چیست؟



mahan206
دوشنبه 30 دی 1398, 18:31 عصر
سلام
من از این روش برای فشرده سازی تصاویر استفاده کردم.
public static MemoryStream ImageQualityLevel()
{
var bitmap = new System.Drawing.Bitmap(@"d:\123.bmp");
var imageEncoder = GetEncoder(System.Drawing.Imaging.ImageFormat.Jpeg );
var encoderType = System.Drawing.Imaging.Encoder.Quality;
var encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
var imageQuality = 50L;
var parameter = new System.Drawing.Imaging.EncoderParameter(encoderTyp e, imageQuality);

encoderParameters.Param[0] = parameter;
MemoryStream ms=new MemoryStream();
bitmap.Save(ms, imageEncoder, encoderParameters);
bitmap.Dispose();
return ms;

}

private static System.Drawing.Imaging.ImageCodecInfo GetEncoder(System.Drawing.Imaging.ImageFormat format)
{
var codecs = System.Drawing.Imaging.ImageCodecInfo.GetImageDeco ders();

foreach (var codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}

یک عکس 3.90 مگا بایتی رو تبدیلش کرد به 3.20 مگا بایت؟؟؟ حتی وقتی 10L هم شد شد2.9 مگا بایت در کل چه روشی وجود داره که عکس 4 مگ بشه 248 کیلو بایت؟
مثل نرم افزاری که داخل مجموعه آفیس هست و کمپرس تصویرش این کار رو انجا میده.

the king
دوشنبه 30 دی 1398, 22:23 عصر
سلام
من از این روش برای فشرده سازی تصاویر استفاده کردم.
public static MemoryStream ImageQualityLevel()
{
var bitmap = new System.Drawing.Bitmap(@"d:\123.bmp");
var imageEncoder = GetEncoder(System.Drawing.Imaging.ImageFormat.Jpeg );
var encoderType = System.Drawing.Imaging.Encoder.Quality;
var encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
var imageQuality = 50L;
var parameter = new System.Drawing.Imaging.EncoderParameter(encoderTyp e, imageQuality);

encoderParameters.Param[0] = parameter;
MemoryStream ms=new MemoryStream();
bitmap.Save(ms, imageEncoder, encoderParameters);
bitmap.Dispose();
return ms;

}

private static System.Drawing.Imaging.ImageCodecInfo GetEncoder(System.Drawing.Imaging.ImageFormat format)
{
var codecs = System.Drawing.Imaging.ImageCodecInfo.GetImageDeco ders();

foreach (var codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}

یک عکس 3.90 مگا بایتی رو تبدیلش کرد به 3.20 مگا بایت؟؟؟ حتی وقتی 10L هم شد شد2.9 مگا بایت در کل چه روشی وجود داره که عکس 4 مگ بشه 248 کیلو بایت؟
مثل نرم افزاری که داخل مجموعه آفیس هست و کمپرس تصویرش این کار رو انجا میده.
چند تا مساله هست، یکی اینکه انکودر پیشفرض ویندوز و NET. خیلی جالب انگیز ناک نیست. کتابخانه های پردازش تصویر معمولا از این روتین های پیشفرض مایکروسافت بهتر عمل می کنند، هم از نظر سرعت و هم کیفیت و هم حجم و هم پشتیبانی از فرمت ها و تنوع تنظیمات.
مورد بعدی اینه که در انتخاب فرمت اگه به نوع تصویر و تعداد رنگ و جزئیاتش توجه بشه در نتیجه موثر خواهد بود. مثلا معمولا در تصاویری که تعداد رنگ کمه، فرمت های png و gif بهتر جواب میدن تا jpeg
یا بخاطر خصوصیات فشرده سازی استفاده شده در jpeg، تصاویری که قدری محو هستند یا رنگ ها در یک طیف خاصی و بهم نزدیک هستند (مثلا طیف سیاه و سفید خاکستری یا متمایل به آبی) بهتر فشرده میشن.
برای همین فرضا اگه کمی تصویر قبل از ذخیره سازی با فیلتر های Blur و کم کردن Hue کمی و ناچیز دستکاری بشه، jpeg اش بصورت موثری کاهش حجم پیدا می کنه.
طبعا میشه با کد خالص #C اینکار ها رو انجام داد، ولی با سرعت پایین.
کتابخانه های تخصصی مثل ImageProcessor و Magick.NET و GraphicsMagick حتی اگه کد خالص #C بکار ببرند، برای افزایش سرعت بهینه شده هستند، معمولا بهتر و سریعتر عمل می کنند و انکودر های قوی تری هم دارند.