处理大量图片可以通过使用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);
}