我希望有一个能够缩小图片尺寸的函数。
这个函数应该接受图片的URL,检查图片是否大于4MB,如果是,则将其缩小到小于4MB并返回字节大小。
我有以下方法:
public byte[] ResizeImage(string url)
{
var uri = new Uri(url);
var c = new WebClient();
var oldImgStream = new MemoryStream(c.DownloadData(uri));
if (oldImgStream.Length <= 4194304)
{
return oldImgStream.ToArray();
}
using (var oldImage = new Bitmap(oldImgStream))
using (var newImageStream = new MemoryStream())
{
var format = oldImage.RawFormat;
float resizePercent = (float)4194304 / oldImgStream.Length;
var newImage = ResizeImageByPercent(oldImage, resizePercent);
newImage.Save(newImageStream, format);
return newImageStream.ToArray();
}
}
public static Bitmap ResizeImageByPercent(Bitmap image, float resizePercent)
{
//Set minimum resizePercentage to 80%
resizePercent = resizePercent > 0.8 ? (float)0.8 : resizePercent;
int newWidth = (int)(image.Width * resizePercent);
int newHeight = (int)(image.Height * resizePercent);
var newImage = new Bitmap(newWidth, newHeight);
using (var graphics = Graphics.FromImage(newImage))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
graphics.FillRectangle(Brushes.Transparent, 0, 0, newWidth, newHeight);
graphics.DrawImage(image, 0, 0, newWidth, newHeight);
return newImage;
}
}
但这并不好用。
我有一张jpg图像作为示例。
图片大小略大于4MB(4194587字节)。 图像的分辨率为2272 x 1704。
因此,当我尝试使用上述方法调整此图像的大小时。 它首先计算“resizePercentage”为:
float resizePercent = (float)4194304 / oldImgStream.Length;
resizePercent = (float)4194304 / 4194587;
resizePercent = 0.9999325 //(99.99325%)
但是因为我已经将resizePercent的最小值设置为0.8(80%),所以它会被设置为这个值。
resizePercent = 0.8;
然后它将使用这个resizePercent计算新的宽度和高度。
新的分辨率将是:1817 x 1363,图像被调整为新的分辨率。但是,在将其保存到流中并读取字节后,它返回了更大的图像。返回的图像大小为“5146056字节”即5MB。
那么有人知道如何实现这一点,或者我的方法有什么问题,以至于它返回了更大的图像,即使分辨率降低了。
我应该能够缩小png、jpg和gif图像的大小。