我有非常大的图像(jpg),我想编写一个 csharp 程序来循环文件并将每个图像的大小减少 75%。
我试过这个:
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
但文件大小仍然很大。
无论如何创建缩略图并让文件大小更小?
我有非常大的图像(jpg),我想编写一个 csharp 程序来循环文件并将每个图像的大小减少 75%。
我试过这个:
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
但文件大小仍然很大。
无论如何创建缩略图并让文件大小更小?
private void CompressAndSaveImage(Image img, string fileName,
long quality) {
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
img.Save(fileName, GetCodecInfo("image/jpeg"), parameters);
}
private static ImageCodecInfo GetCodecInfo(string mimeType) {
foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders())
if (encoder.MimeType == mimeType)
return encoder;
throw new ArgumentOutOfRangeException(
string.Format("'{0}' not supported", mimeType));
}
用法:
Image myImg = Image.FromFile(@"C:\Test.jpg");
CompressAndSaveImage(myImg, @"C:\Test2.jpg", 10);
这将以 10 的质量压缩 Test.jpg 并将其保存为 Test2.jpg。
编辑:作为扩展方法可能会更好:
private static void SaveCompressed(this Image img, string fileName,
long quality) {
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
img.Save(fileName, GetCodecInfo("image/jpeg"), parameters);
}
用法:
Image myImg = Image.FromFile(@"C:\Test.jpg");
myImg.SaveCompressed(@"C:\Test2.jpg", 10);
ImageMagick是一个命令行工具,对于图像处理来说非常强大。在源图像的纵横比未知或不可靠的情况下,我使用它来调整大图像的大小和创建缩略图。ImageMagick 能够将图像调整为特定的高度或宽度,同时保持图片的原始纵横比。如果需要,它还可以在图像周围添加空间。总而言之,它非常强大,是一个很好的抽象,无需处理 .net 图像 API。要在 C# 中使用 imageMagick 命令行工具,我建议使用 System.Diagnostics.ProcessStartInfo 对象,如下所示:
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\Program Files\ImageMagick-6.5.0-Q16\convert.exe";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.Arguments = string.Format("-size x{0} \"{1}\" -thumbnail 200x140 -background transparent -gravity center -extent 200x140 \"{2}\"", heightToResizeTo, originalTempFileLocation, resizedTempFileLocation);
Process p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
使用 scale% 参数,您可以轻松地将图像大小减小 75%
压缩你的图像。对于缩略图,JPEG 就足够了,因为您不是在寻找质量。
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
thumbNail.Save(fileName, ImageFormat.Jpeg);
来自GetThumbnailImage
的文档:
如果 Image 包含嵌入的缩略图图像,则此方法检索嵌入的缩略图并将其缩放到请求的大小。如果 Image 不包含嵌入的缩略图图像,则此方法通过缩放主图像来创建缩略图图像。
我建议您使用较小的宽度和高度值。尝试:
// reduce the size of each image by 75% from original 800x600
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero);
请参阅示例代码。
另请阅读文档:
当请求的缩略图图像的大小约为 120 x 120 像素时,GetThumbnailImage 方法工作得很好。如果您从具有嵌入式缩略图的图像中请求较大的缩略图图像(例如,300 x 300),则缩略图图像的质量可能会明显下降。通过调用 DrawImage 方法来缩放主图像(而不是缩放嵌入的缩略图)可能会更好。
我想你可能想看看缩放 API。
这种方法对我帮助很大。图像尺寸小,保持纵横比
ShellFile shellFile = ShellFile.FromFilePath(ImageWithPath); //original image path
Bitmap shellThumbSmall = shellFile.Thumbnail.ExtraLargeBitmap; //change image size
shellThumbSmall.Save(ImageWithPathThumbnail, ImageFormat.Jpeg); // new image path and format
这些是需要的
PM> Install-Package WindowsAPICodePack-Core
PM> Install-Package WindowsAPICodePack-Shell
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack;