C#实现对图片排序,修改,删除,压缩,转换,分类,保存 – 三郎君的日常

C# · 2023年5月24日 0

C#实现对图片排序,修改,删除,压缩,转换,分类,保存

处理大量图片可以通过使用C#的System.Drawing命名空间和GDI+进行实现。

首先,需要在代码中引用System.Drawing和System.IO。

然后,可以使用Image.FromFile方法读取图片并进行处理。例如,可以调整图片大小、修改像素、转换格式等。

若需要同时处理多个图片,可以使用多线程或异步处理。可以使用Parallel.ForEach方法创建多线程,或使用async和await关键字进行异步处理。

另外,为了避免内存溢出,需要及时释放图片资源。可以使用Dispose方法释放已经处理过的图片。

以下是一个简单的例子,演示如何读取、调整大小并保存多个图片:

using System.Drawing;
using System.IO;

namespace ImageProcessing
{
    class Program
    {
        static void Main(string[] args)
        {
            // 读取图片
            Image image = Image.FromFile("image.jpg");

            // 调整大小
            int newWidth = 800;
            int newHeight = (int)(image.Height * ((float)newWidth / image.Width));
            Image newImage = new Bitmap(newWidth, newHeight);
            Graphics graphics = Graphics.FromImage(newImage);
            graphics.DrawImage(image, new Rectangle(0, 0, newWidth, newHeight), new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel);
            graphics.Dispose();

            // 保存图片
            string path = "newImage.jpg";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            newImage.Save(path);

            // 释放资源
            image.Dispose();
            newImage.Dispose();
        }
    }
}

1.  获取图片大小

使用C#的System.IO命名空间中的FileInfo类,可以轻松地获取图片的大小。例如:

using System.IO;

// 获取图片大小
FileInfo fileInfo = new FileInfo("image.jpg");
long fileSize = fileInfo.Length; // 单位为字节

2.  图片大小排序

可以使用Linq进行图片大小排序。例如:

using System.Linq;
using System.IO;

// 获取所有图片的大小
DirectoryInfo directoryInfo = new DirectoryInfo("images");
FileInfo[] files = directoryInfo.GetFiles("*.*", SearchOption.AllDirectories)
    .Where(file => file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png").ToArray();
long[] fileSizes = files.Select(file => file.Length).ToArray();

// 对图片大小进行排序
var sorted = files.OrderBy(file => file.Length);

3.  图片名称排序

同样可以使用Linq进行图片名称排序。例如:

using System.Linq;
using System.IO;

// 获取所有图片的名称
DirectoryInfo directoryInfo = new DirectoryInfo("images");
FileInfo[] files = directoryInfo.GetFiles("*.*", SearchOption.AllDirectories)
    .Where(file => file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png").ToArray();
string[] fileNames = files.Select(file => file.Name).ToArray();

// 对图片名称进行排序
var sorted = files.OrderBy(file => file.Name);

4.  图片日期排序

同样可以使用Linq进行图片日期排序。例如:

using System.Linq;
using System.IO;

// 获取所有图片的日期
DirectoryInfo directoryInfo = new DirectoryInfo("images");
FileInfo[] files = directoryInfo.GetFiles("*.*", SearchOption.AllDirectories)
    .Where(file => file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png").ToArray();
DateTime[] fileDates = files.Select(file => file.LastWriteTime).ToArray();

// 对图片日期进行排序
var sorted = files.OrderBy(file => file.LastWriteTime);

5.  修改图片名称

使用FileInfo的MoveTo方法可以轻松修改图片的名称。例如:

using System.IO;

// 修改图片名称
FileInfo fileInfo = new FileInfo("image.jpg");
fileInfo.MoveTo("newImage.jpg");

6.  修改图片大小

使用Graphics.DrawImage方法可以调整图片大小。例如:、

using System.Drawing;
using System.IO;

// 修改图片大小
Image image = Image.FromFile("image.jpg");
int newWidth = 800;
int newHeight = (int)(image.Height * ((float)newWidth / image.Width));
Image newImage = new Bitmap(newWidth, newHeight);
Graphics graphics = Graphics.FromImage(newImage);
graphics.DrawImage(image, new Rectangle(0, 0, newWidth, newHeight), new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel);
graphics.Dispose();
newImage.Save("newImage.jpg");

7.  修改像素

可以使用Bitmap的SetPixel方法修改图片的像素。例如:

using System.Drawing;
using System.IO;

// 修改图片像素
Bitmap bitmap = new Bitmap("image.jpg");
for (int y = 0; y < bitmap.Height; y++)
{
    for (int x = 0; x < bitmap.Width; x++)
    {
        Color color = bitmap.GetPixel(x, y);
        if (color.B > 128)
        {
            bitmap.SetPixel(x, y, Color.White);
        }
        else
        {
            bitmap.SetPixel(x, y, Color.Black);
        }
    }
}
bitmap.Save("newImage.jpg");

8.  转换图片格式

使用Image.Save方法可以将图片格式转换为其他格式。例如:

using System.Drawing;
using System.IO;

// 转换图片格式
Image image = Image.FromFile("image.jpg");
image.Save("newImage.png", System.Drawing.Imaging.ImageFormat.Png);

9.  图片压缩

使用EncoderParameter和EncoderParameters可以进行图片压缩。例如:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

// 图片压缩
Image image = Image.FromFile("image.jpg");
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, 50L); // 压缩质量为50%
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
ImageCodecInfo jpegCodec = ImageCodecInfo.GetImageDecoders().First(codec => codec.FormatID == ImageFormat.Jpeg.Guid);
image.Save("newImage.jpg", jpegCodec, encoderParams);

10.  图片分类

可以根据图片的Exif信息进行分类。例如:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;

// 图片分类
DirectoryInfo directoryInfo = new DirectoryInfo("images");
FileInfo[] files = directoryInfo.GetFiles("*.*", SearchOption.AllDirectories)
    .Where(file => file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png").ToArray();
foreach (FileInfo file in files)
{
    Image image = Image.FromFile(file.FullName);
    PropertyItem propertyItem = image.GetPropertyItem(36867); // Exif信息中的拍摄日期
    string dateStr = Encoding.ASCII.GetString(propertyItem.Value).Trim('\0');
    DateTime date = DateTime.ParseExact(dateStr, "yyyy:MM:dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
    string path = Path.Combine(directoryInfo.FullName, date.Year.ToString(), date.Month.ToString(), date.Day.ToString());
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    string newPath = Path.Combine(path, file.Name);
    if (File.Exists(newPath))
    {
        File.Delete(newPath);
    }
    File.Move(file.FullName, newPath);
}