我有非常大的图像(jpg),我想编写一个csharp程序来遍历文件,并将每个图像的大小减少75%。
我试过了:
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
但文件大小仍然非常大。
无论如何都要创建缩略图并使文件大小更小?
答案 0 :(得分:18)
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);
答案 1 :(得分:2)
ImageMagick是一个命令行工具,对于进行图像处理非常强大。我已经将它用于在源图像的宽高比未知或不可靠的情况下调整大图像和缩略图创建的大小。 ImageMagick能够将图像调整到特定的高度或宽度,同时保持图片的原始高宽比。如果需要,它还可以在图像周围添加空间。总而言之,非常强大,并且不必处理.nets图像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();
使用比例%参数,您可以轻松地将图像尺寸缩小75%
答案 2 :(得分:1)
压缩图像。对于缩略图,JPEG就足够了,因为你不是在寻找质量。
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());
thumbNail.Save(fileName, ImageFormat.Jpeg);
答案 3 :(得分:0)
来自GetThumbnailImage
的文档:
如果图像包含嵌入的缩略图图像,则此方法将检索嵌入的缩略图并将其缩放到请求的大小。如果图像不包含嵌入的缩略图图像,则此方法通过缩放主图像来创建缩略图图像。
我建议您使用较小的宽度和高度值。尝试:
// reduce the size of each image by 75% from original 800x600
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero);
请参阅sample代码。
另请阅读文档:
当请求的缩略图图像的大小约为120 x 120像素时,GetThumbnailImage方法很有效。如果从具有嵌入式缩略图的图像请求大型缩略图图像(例如,300 x 300),则缩略图图像中可能会出现明显的质量损失。通过调用DrawImage方法缩放主图像(而不是缩放嵌入的缩略图)可能会更好。
我想你可能想看一下缩放API。
答案 4 :(得分:0)
这种方法对我很有帮助。图像尺寸小,保持宽高比
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;