gpt4 book ai didi

c# - 在 C# 中减小图像大小

转载 作者:太空狗 更新时间:2023-10-29 20:38:48 25 4
gpt4 key购买 nike

我想要减小图像尺寸的功能。

该函数应获取图像 URL,检查图像大小是否为 4MB 或更大,如果是,则将其大小调整为 lover,然后为 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 的大小

最佳答案

在处理压缩位图时,图像文件大小和分辨率之间没有一对一的关系。对于真正的位图(例如 BMP),这种相关性确实存在,因为 1 个像素总是等于定义的字节数(基于颜色空间)。

但是,在谈论压缩位图(如 JPEG)时,文件大小取决于压缩效率(总体上需要编码多少种颜色,基于相同颜色可以组合多少像素,或者多少抖动可以创建更多可以组合的相同颜色的像素)。对于较低分辨率的图像,这可能最终会减少,但它也可以很容易地保持不变甚至增加,这取决于原始压缩的效率以及较少数量的像素总体对压缩效率的影响.

总而言之,您不能仅仅应用简单的基于百分比的分辨率降低来确保一定的文件大小。你真正能做的最好的事情是逐渐降低分辨率,在每次迭代中测试文件大小,直到它低于你的阈值,假设它确实低于阈值。有 4MB 可供使用,可以想象有一定的分辨率肯定会低于该分辨率,但实际上无法计算该点所在的位置。

此外,这将根据图像格式的类型而有所不同。 JPEG 主要通过尝试尽可能多地散布颜色(抖动)来发挥作用。这就是为什么较低质量的 JPEG 会显示伪像。不过,PNG 和 GIF 大多是索引的,其中试图减少颜色的总量(尽管两者也可以使用抖动)。 PNG 使事情变得更加复杂,因为您还可以拥有无​​损 PNG,其中保留所有颜色和像素,但应用简单的压缩(很像 ZIP 存档)以减小文件大小。所有这些在不同的分辨率下都会有不同的行为。

关于c# - 在 C# 中减小图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35182429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com