将图片分辨率调整成同样大小
title: 将图片分辨率调整成同样大小
url: process-image-to-uniform-resolution
date: 2024年04月29日
category: 图像处理
tags:
ImageSharp
将图片分辨率调整成同样大小
下载了一些壁纸,各种分辨率的都有,设置成桌面壁纸剧中显示,分辨率大的只显示中间,比例不合适的有黑边,看起来很不爽。
我的显示器是 1920×1080 分辨率,想把这些壁纸统一成 1920×1080 的分辨率,找到的工具 XnResize 竟然实现不了,所以找到了 C# 的图片处理库 ImageSharp。
主要使用这个库的 Resize 功能,有好几种 ResizeMode,有不同效果,可以自己尝试。具体参考官方 API。
注意 :ImageSharp 貌似只能在.Net 6 使用,在.Net Framework 4.8 使用不了
完整代码如下:
namespace ImageSharpDemo
{
internal class Program
{
static void Main(string[] args)
{
const int WIDTH = 1920;
const int HEIGHT = 1080;
bool single = false;
// 需要处理的图片目录
var imgdir = @"C:\data\images\wallpaper";
// 图片处理后的存放目录
var outdir = @"C:\Users\usr\Downloads\wallbagres";
if (single)
{// 处理单个图片
var simgfile = @"C:\Users\usr\Downloads\resizetest\1.jpg";
var soutfile = @"C:\Users\usr\Downloads\resizetest\1_out.jpg";
ImgResize (WIDTH, HEIGHT, simgfile, soutfile);
Console.WriteLine ("done");
return;
}
if (!Directory.Exists (imgdir))
{
Console.WriteLine (" 目录不存在 & quot;);
return;
}
if (!Directory.Exists (outdir))
{
Directory.CreateDirectory (outdir);
}
var imgfiles = Directory.GetFiles (imgdir, "", SearchOption.AllDirectories);
var total = imgfiles.Length;
int idx = 0;
foreach (var imgfile in imgfiles)
{
idx++;
var imgfi = new FileInfo (imgfile);
var imgname = imgfi.Name;
var outfile = Path.Combine (outdir, imgname);
ImgResize (WIDTH, HEIGHT, imgfile, outfile);
Console.WriteLine ($"[{idx}/{total}] resize {imgname}");
}
}
private static void ImgResize(int WIDTH, int HEIGHT, string img, string output)
{
try
{
using Image image = Image.Load (img);
if (image.Width * 9 == image.Height * 16 &&
image.Width >= WIDTH && image.Height >= HEIGHT)
{// 比例是 16:9
image.Mutate (x => x.Resize (WIDTH, HEIGHT));
image.Save (output);
}
else if (image.Width >= WIDTH && image.Height >= HEIGHT)
{// 从图片中取最大的 16:9 区域
image.Mutate (x =>
{
x.Resize (new ResizeOptions
{
Size = new Size (WIDTH, HEIGHT),
Mode = ResizeMode.Crop,
});
});
image.Save (output);
}
else
{
Console.WriteLine ($" 分辨率 {image.Width}*{image.Height} 太小,跳过。");
}
}
catch (Exception ex)
{
Console.WriteLine (ex);
}
}
}
}