图像降采样压缩
今天遇到一个应用场景,给定一张大图,压缩图像到指定分辨率,并且要求小于指定文件大小。

这是512x512的原图,目标分辨率是162x162, 目标文件大小小于16KB
原图resize到162之后

但是体积足足有37K,无论采用什么方式都很难再图像不严重失真的情况下进一步压缩文件大小了。
这时就需要降采样,然后升采样,在不严重失真的情况下进一步降低图像的信息熵。
var input = "path-to-your.jpg";
var output = input + ".png";
using (var origin = Cv2.ImRead(input))
{
// 反复降采样再升采样
for (int i = 162; i > 3; i--)
{
using (var resized1 = origin.Resize(new Size(i, i), 0, 0, InterpolationFlags.Area)) // InterpolationFlags.Area设置很重要
using (var resized2 = resized1.Resize(new Size(162, 162), 0, 0, InterpolationFlags.Nearest)) // InterpolationFlags.Nearest设置很重要
{
Cv2.ImEncode(".png", resized2, out var pngBuffer, new ImageEncodingParam(ImwriteFlags.PngCompression, 9));
if (pngBuffer.Length < 16 * 1024)
{
File.WriteAllBytes(output, pngBuffer);
break;
}
}
}
}

162x162,15KB左右,问题解决。
在面临图像压缩挑战时,通过反复降采样再升采样可以有效减小文件体积而不严重失真。博客中介绍了一个实际案例,将512x512的图像压缩到162x162,目标文件大小小于16KB。通过OpenCV库的InterpolationFlags设置,最终成功将图像压缩到15KB左右,解决了问题。
1500

被折叠的 条评论
为什么被折叠?



