创建缩略图并缩小图像大小
我有非常大的图像(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);
这将压缩Test.jpg的质量为10并将其保存为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能够将图像调整到特定的高度或宽度,同时保持图片的原始高宽比。 如果需要,它还可以在图像周围添加空间。 总而言之,非常强大,并且不必处理.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();
使用scale%paramater,您可以轻松地将图像大小缩小75%
压缩图像。 对于缩略图,JPEG就足够了,因为您不是在寻找质量。
Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); thumbNail.Save(fileName, ImageFormat.Jpeg);
来自GetThumbnailImage
的文档:
如果图像包含嵌入的缩略图图像,则此方法将检索嵌入的缩略图并将其缩放到请求的大小。 如果图像不包含嵌入的缩略图图像,则此方法通过缩放主图像来创建缩略图图像。
我建议你使用较小的宽度和高度值。 尝试:
// 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。