尝试使用ImageCodecInfo 类,它提供了控制用于对图像格式进行编码的编解码器参数的方法。
在 GDI+ 中,您可以指定数量非常有限的参数。在实践中,只有Compression 方法和Quality 级别决定了压缩级别(0-100,其中0 是最大压缩)。
这些参数组装在EncoderParameters 对象的EncoderParameter 数组中 - 用于指定Encoder 主题 - 在将它们传递给接受 Image.Save() 重载之前>ImageCodecInfo 和 EncoderParameters 作为参数。
示例方法调用:
将源图像保存为 TIFF 格式,使用相同的 DPI 设置,压缩级别设置为 50%。图片保存为24bpp RGB格式。根据需要进行修改。
压缩类型为LZW。
Dim jpgImage As Image = Image.FromFile("ImageFile.jpg"), True)
SaveTiffImage(jpgImage, jpgImage.VerticalResolution, 50L, "DestinationFile.tif")
jpgImage.Dispose()
编解码器初始化方法:
Imports System.Drawing
Imports System.Drawing.Imaging
Imports ImageCodec = System.Drawing.Imaging.Encoder
Private Sub SaveTiffImage(image As Image, resolution As Single, compressionLevel As Long, fileName As String)
resolution = Math.Max(72, Math.Min(2400, resolution))
compressionLevel = Math.Max(0, Math.Min(100, compressionLevel))
Using bitmap = New Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb)
bitmap.SetResolution(resolution, resolution)
Using g = Graphics.FromImage(bitmap)
g.DrawImage(image, New Rectangle(Point.Empty, image.Size),
New Rectangle(Point.Empty, image.Size), GraphicsUnit.Pixel)
Dim codec = ImageCodecInfo.GetImageEncoders().
FirstOrDefault(Function(enc) enc.FormatID = ImageFormat.Tiff.Guid)
Dim qualityParam =
New EncoderParameter(ImageCodec.Quality, compressionLevel)
Dim compressionParam =
New EncoderParameter(ImageCodec.Compression, EncoderValue.CompressionLZW)
Using codecParms = New EncoderParameters(2)
codecParms.Param(0) = qualityParam
codecParms.Param(1) = compressionParam
bitmap.Save(fileName, codec, codecParms)
End Using
End Using
End Using
End Sub
C# 版本:
using System.Drawing;
using System.Drawing.Imaging;
using ImageCodec = System.Drawing.Imaging.Encoder;
private void SaveTiffImage(Image image, float resolution, long compressionLevel, string fileName)
{
resolution = Math.Max(72, Math.Min(2400, resolution));
compressionLevel = Math.Max(0, Math.Min(100, compressionLevel));
using (var bitmap = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb))
{
bitmap.SetResolution(resolution, resolution);
using (var g = Graphics.FromImage(bitmap))
{
g.DrawImage(image, new Rectangle(Point.Empty, image.Size),
new Rectangle(Point.Empty, image.Size), GraphicsUnit.Pixel);
var imageCodec = ImageCodecInfo.GetImageEncoders()
.FirstOrDefault(enc => enc.FormatID == ImageFormat.Tiff.Guid);
if (imageCodec == null)
throw new NotSupportedException("TIFF Conversion not suppoted",
new NullReferenceException("TIFF Codec reference missing"));
var qualityParam =
new EncoderParameter(ImageCodec.Quality, compressionLevel);
var compressionParam =
new EncoderParameter(ImageCodec.Compression, (long)EncoderValue.CompressionLZW);
using (var codecParms = new EncoderParameters(2))
{
codecParms.Param[0] = qualityParam;
codecParms.Param[1] = compressionParam;
bitmap.Save(fileName, imageCodec, codecParms);
}
}
}
}