TIF压缩CCITT4

问题描述 投票:1回答:1

我正在尝试使用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();
        }
    }
c# compression tiff image-compression
1个回答
0
投票

由于源图像似乎是彩色图像(恰好看起来像黑白),并且其尺寸需要调整为最大值,因此您需要:

  1. 按比例重新定义源图像的大小,设置转换后的图像需要遵守的最大宽度和高度限制
  2. 将图像转换为1bpp Indexed格式:Bitmap.Clone()方法提供了两种方法,既可以定义源图像的新尺寸,又可以设置特定的PixelFormat(在这种情况下为PixelFormat.Format1bppIndexed)。内部转换方法非常好,通常会很好地折衷所得到的图像质量。
  3. 定义quality of the Image:由于图像将被转换为黑白,因此可以将其画质初始设置为最大值(100)。如果最终图像字节数不符合要求(50KB
  4. ,可以重复此过程
  5. 使用CCTII组4 Compress the Image的[Compression scheme
  6. [Encode the Image,使用TIFF格式编码器,将其保存到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)); }
© www.soinside.com 2019 - 2024. All rights reserved.