将图片分辨率调整成同样大小

8

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);
            }
        }
    }
}