图像降采样压缩
今天遇到一个应用场景,给定一张大图,压缩图像到指定分辨率,并且要求小于指定文件大小。
这是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左右,问题解决。