更改尺寸
问题描述:
我需要通过网络来传输一些图片,我保存JPEG和40%的图像质量如下:更改尺寸
public void SaveJpeg(string path, Image image, int quality) {
if((quality < 0) || (quality > 100)) {
string error = string.Format("Jpeg image quality must be
between 0 and 100, with 100 being the highest quality. A value of {0} was
specified.", quality);
throw new ArgumentOutOfRangeException(error);
}
EncoderParameter qualityParam = new
EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
image.Save(path, jpegCodec, encoderParams);
}
但随着这样的JPEG文件的大小不够小,我也改变质量,但这不是很好的外观。有什么办法可以保存较小文件大小和适当外观的图片吗?我不知道,但有没有办法使用System.Drawing.Graphics
对象,我也不需要压缩文件,或者更改图像的尺寸,现在只是图片文件的大小很重要。
答
对于图像压缩,创建小文件和创建质量较差的图像之间存在细微的差别。 JPEG是一种有损压缩格式,这意味着数据在压缩时会被删除,这就是为什么不断重新编码JPEG文件会不断降低其质量的原因。
另一方面,PNG文件是无损的,但仍可能导致更大的文件。您可以尝试使用PngBitmapEncoder将文件编码为PNG。这将确保质量仍然很高,但尺寸可能会或可能不会降低到足够您的程序(这取决于图像)。
如果您在本地计算机上执行此操作,并且不需要经常执行此操作(例如对于许多并发用户),则可以调用外部程序为您执行操作。 PNG Monster非常擅长压缩PNG文件而不降低质量。你可以从你的程序调用它并发送PNG文件。 (您可能想检查许可条款以确保它与您的程序兼容)。
没有很多方法可以保持高质量并同时执行高压缩,而无需操纵图像(例如更改尺寸)。
答
我有一个方法来创建和保存上传图片的缩略图,我认为NewImageSize
方法可能会帮助你。它也处理质量问题。
public Size NewImageSize(int OriginalHeight, int OriginalWidth, double FormatSize)
{
Size NewSize;
double tempval;
if (OriginalHeight > FormatSize && OriginalWidth > FormatSize)
{
if (OriginalHeight > OriginalWidth)
tempval = FormatSize/Convert.ToDouble(OriginalHeight);
else
tempval = FormatSize/Convert.ToDouble(OriginalWidth);
NewSize = new Size(Convert.ToInt32(tempval * OriginalWidth), Convert.ToInt32(tempval * OriginalHeight));
}
else
NewSize = new Size(OriginalWidth, OriginalHeight); return NewSize;
}
private bool save_image_with_thumb(string image_name, string path)
{
ResimFileUpload1.SaveAs(path + image_name + ".jpg"); //normal resim kaydet
///////Thumbnail yarat ve kaydet//////////////
try
{
Bitmap myBitmap;
myBitmap = new Bitmap(path + image_name + ".jpg");
Size thumbsize = NewImageSize(myBitmap.Height, myBitmap.Width, 100);
System.Drawing.Image.GetThumbnailImageAbort myCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
// If jpg file is a jpeg, create a thumbnail filename that is unique.
string sThumbFile = path + image_name + "_t.jpg";
// Save thumbnail and output it onto the webpage
System.Drawing.Image myThumbnail = myBitmap.GetThumbnailImage(thumbsize.Width, thumbsize.Height, myCallBack, IntPtr.Zero);
myThumbnail.Save(sThumbFile);
// Destroy objects
myThumbnail.Dispose();
myBitmap.Dispose();
return true;
}
catch //yaratamazsa normal ve thumb iptal
{
return false;
}
///////////////////////////////////
}
您可以使宽度和高度更小或者必须使图片尺寸保持不变吗? – 2012-01-01 13:02:11
@Jason Down不,我希望能找到一种无变化的方式 – Saeid 2012-01-01 13:03:09
那么真的只有三种方法来减小文件的大小。降低质量,减小尺寸或将格式更改为具有更好压缩比的其他格式(不知道如何在.Net中以任何方式执行此操作,而不是通常的选择)。 – 2012-01-01 13:08:48