以下是在 ASP.NET(aspx)中获取指定目录下的所有图片并压缩到指定大小的示例代码:
一、使用 System.Drawing 和 System.IO 命名空间实现
1. 在页面的后台代码中添加以下方法:
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
public void CompressImagesInDirectory(string sourceDirectory, string destinationDirectory, int maxWidth, int maxHeight)
{
if (!Directory.Exists(destinationDirectory))
{
Directory.CreateDirectory(destinationDirectory);
}
string[] imageFiles = Directory.GetFiles(sourceDirectory, "*.jpg");
string[] pngImageFiles = Directory.GetFiles(sourceDirectory, "*.png");
string[] allImageFiles = imageFiles.Concat(pngImageFiles).ToArray();
foreach (string imagePath in allImageFiles)
{
using (Image image = Image.FromFile(imagePath))
{
int newWidth = image.Width;
int newHeight = image.Height;
if (image.Width > maxWidth || image.Height > maxHeight)
{
double ratioX = (double)maxWidth / image.Width;
double ratioY = (double)maxHeight / image.Height;
double ratio = Math.Min(ratioX, ratioY);
newWidth = (int)(image.Width * ratio);
newHeight = (int)(image.Height * ratio);
}
using (Bitmap resizedImage = new Bitmap(newWidth, newHeight))
{
using (Graphics graphics = Graphics.FromImage(resizedImage))
{
graphics.DrawImage(image, 0, 0, newWidth, newHeight);
}
string fileName = Path.GetFileName(imagePath);
string destinationPath = Path.Combine(destinationDirectory, fileName);
ImageFormat format = GetImageFormat(imagePath);
resizedImage.Save(destinationPath, format);
}
}
}
}
private ImageFormat GetImageFormat(string imagePath)
{
string extension = Path.GetExtension(imagePath).ToLower();
if (extension == ".jpg" || extension == ".jpeg")
{
return ImageFormat.Jpeg;
}
else if (extension == ".png")
{
return ImageFormat.Png;
}
else
{
return ImageFormat.Jpeg;
}
}
2. 然后在按钮的点击事件或其他触发事件中调用这个方法:
protected void CompressButton_Click(object sender, EventArgs e)
{
string sourceDirectory = @"C:\YourSourceDirectory";
string destinationDirectory = @"C:\YourDestinationDirectory";
int maxWidth = 800;
int maxHeight = 600;
CompressImagesInDirectory(sourceDirectory, destinationDirectory, maxWidth, maxHeight);
}
请确保将源目录和目标目录替换为实际的路径,并根据需要调整最大宽度和高度。这个方法将遍历指定目录中的所有 JPEG 和 PNG 图像文件,将它们压缩到指定的最大尺寸,并保存到目标目录中。
以下是在上述代码中添加设置压缩质量参数的方法:
修改 CompressImagesInDirectory 方法如下:
public void CompressImagesInDirectory(string sourceDirectory, string destinationDirectory, int maxWidth, int maxHeight, int jpegQuality)
{
if (!Directory.Exists(destinationDirectory))
{
Directory.CreateDirectory(destinationDirectory);
}
string[] imageFiles = Directory.GetFiles(sourceDirectory, "*.jpg");
string[] pngImageFiles = Directory.GetFiles(sourceDirectory, "*.png");
string[] allImageFiles = imageFiles.Concat(pngImageFiles).ToArray();
foreach (string imagePath in allImageFiles)
{
using (Image image = Image.FromFile(imagePath))
{
int newWidth = image.Width;
int newHeight = image.Height;
if (image.Width > maxWidth || image.Height > maxHeight)
{
double ratioX = (double)maxWidth / image.Width;
double ratioY = (double)maxHeight / image.Height;
double ratio = Math.Min(ratioX, ratioY);
newWidth = (int)(image.Width * ratio);
newHeight = (int)(image.Height * ratio);
}
using (Bitmap resizedImage = new Bitmap(newWidth, newHeight))
{
using (Graphics graphics = Graphics.FromImage(resizedImage))
{
graphics.DrawImage(image, 0, 0, newWidth, newHeight);
}
string fileName = Path.GetFileName(imagePath);
string destinationPath = Path.Combine(destinationDirectory, fileName);
ImageFormat format = GetImageFormat(imagePath);
if (format == ImageFormat.Jpeg)
{
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, jpegQuality);
resizedImage.Save(destinationPath, GetJpegCodecInfo(), encoderParams);
}
else
{
resizedImage.Save(destinationPath, format);
}
}
}
}
}
private ImageCodecInfo GetJpegCodecInfo()
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType == "image/jpeg")
return codec;
}
return null;
}
private ImageFormat GetImageFormat(string imagePath)
{
string extension = Path.GetExtension(imagePath).ToLower();
if (extension == ".jpg" || extension == ".jpeg")
{
return ImageFormat.Jpeg;
}
else if (extension == ".png")
{
return ImageFormat.Png;
}
else
{
return ImageFormat.Jpeg;
}
}
2. 然后在调用该方法时传入压缩质量参数,例如:
protected void CompressButton_Click(object sender, EventArgs e)
{
string sourceDirectory = @"C:\YourSourceDirectory";
string destinationDirectory = @"C:\YourDestinationDirectory";
int maxWidth = 800;
int maxHeight = 600;
int jpegQuality = 80;
CompressImagesInDirectory(sourceDirectory, destinationDirectory, maxWidth, maxHeight, jpegQuality);
}
这样就可以在压缩图像时设置 JPEG 图像的压缩质量参数了。对于 PNG 图像,目前没有直接设置压缩质量的方法,因为 PNG 是无损压缩格式。
该文章在 2025/1/2 9:54:31 编辑过