8

我有非常大的图像(jpg),我想编写一个 csharp 程序来循环文件并将每个图像的大小减少 75%。

我试过这个:

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());

但文件大小仍然很大。

无论如何创建缩略图并让文件大小更小?

4

5 回答 5

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);
于 2009-03-26T01:13:23.107 回答
2

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%

于 2009-05-13T12:24:21.383 回答
1

压缩你的图像。对于缩略图,JPEG 就足够了,因为您不是在寻找质量。

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr());

thumbNail.Save(fileName, ImageFormat.Jpeg);
于 2009-03-26T00:47:24.230 回答
0

来自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。

于 2009-03-26T01:17:45.247 回答
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;
于 2019-05-27T03:07:25.383 回答