我正在尝试使用CCITT4压缩tiff文件。原始大小为101 KB,运行后大小减少了98 KB。我的限制大小为50 KB,如何使大小小于限制?代码如下
我的极限;大小<50KB图像宽度:1766 – 1890像素图片长度:915 – 1040像素
谢谢大家。Image Sample
public static Byte[] CompressBitmap(Bitmap img)
{
Bitmap bm = img;
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType == "image/tiff")
ici = codec;
}
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag,
(long)EncoderValue.Flush);
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression,
(long)EncoderValue.CompressionCCITT4);
using (var stream = new MemoryStream())
{
bm.Save(stream, ici, ep);
return stream.ToArray();
}
}
由于源图像似乎是彩色图像(恰好看起来像黑白),并且其尺寸需要调整为最大值,因此您需要:
1bpp Indexed
格式:Bitmap.Clone()方法提供了两种方法,既可以定义源图像的新尺寸,又可以设置特定的PixelFormat(在这种情况下为PixelFormat.Format1bppIndexed
)。内部转换方法非常好,通常会很好地折衷所得到的图像质量。 100
)。如果最终图像字节数不符合要求(50KB
)MemoryStream
进行进一步处理问题中提供的示例图像的字节大小,当保存到文件中时,从最初的[[94,600
字节减少为6,786
] >>字节,具有最高质量。 File.WriteAllBytes("[Image Path].tiff", imageStream.ToArray());
方法可以称为:
ConvertToBWTiffImageStream()
var maximumWidthAndHeight = new Size(1024, 768);
int quality = 100;
var compression = EncoderValue.CompressionCCITT4;
var imageStream = ConvertToBWTiffImageStream(sourceImage, maximumWidthAndHeight, quality, compression);
注意指定最大宽度和最大高度,而不是图像的新尺寸(否则会失真)。图像尺寸将根据这些值成比例地缩放。
maximumWidthAndHeight
[using ImageCodec = System.Drawing.Imaging.Encoder;
([GetImageMaxSize()
using System.Drawing;
using System.Drawing.Imaging;
using ImageCodec = System.Drawing.Imaging.Encoder;
private MemoryStream ConvertToBWTiffImageStream(Bitmap image, Size maxWidthHeight, long compressionLevel, EncoderValue compressionScheme)
{
var imageSize = GetImageMaxSize(image, maxWidthHeight);
var bwImage = image.Clone(new Rectangle(Point.Empty, image.Size), PixelFormat.Format1bppIndexed);
compressionLevel = Math.Max(0, Math.Min(100, compressionLevel));
var codecParms = new EncoderParameters(2);
try {
var imageCodec = ImageCodecInfo.GetImageEncoders().FirstOrDefault(enc => enc.FormatID == ImageFormat.Tiff.Guid);
var qualityParam = new EncoderParameter(ImageCodec.Quality, compressionLevel);
var compressionParam = new EncoderParameter(ImageCodec.Compression, (long)compressionScheme);
var ms = new MemoryStream();
codecParms.Param[0] = qualityParam;
codecParms.Param[1] = compressionParam;
image.Save(ms, imageCodec, codecParms);
return ms;
}
finally {
codecParms.Dispose();
bwImage.Dispose();
}
}
private Size GetImageMaxSize(Image image, Size maxSize)
{
float scale = 1.0f;
if (image.Width > maxSize.Width && image.Width >= image.Height) {
scale = (float)maxSize.Width / image.Width;
}
else if (image.Height > maxSize.Height) {
scale = (float)maxSize.Height / image.Height;
}
return new Size((int)(image.Width * scale), (int)(image.Height * scale));
}