【问题标题】:Compressing a TIF file压缩 TIF 文件
【发布时间】:2020-04-05 17:07:49
【问题描述】:

我正在尝试将多页彩色 tiff 文件转换为 C# 中的 c# CompressionCCITT3 tiff。我意识到我需要确保所有像素都是 1 位。我没有在网上找到一个有用的例子。

【问题讨论】:

    标签: c# tiff


    【解决方案1】:

    您需要这种转换,因为 CCITT3 和 CCITT4 不支持颜色(如果我没记错的话)。

    【讨论】:

      【解决方案2】:

      拉皮条免责声明:我在 Atalasoft 工作,这是一家生产 .NET 成像软件的公司。

      使用dotImage,这个任务变成这样:

      FileSystemImageSource source = new FileSystemImageSource("path-to-your-file.tif", true); // true = loop over all frames
      // tiff encoder will auto-select an appropriate compression - CCITT4 for 1 bit.
      TiffEncoder encoder = new TiffEncoder();
      encoder.Append = true;
      
      // DynamicThresholdCommand is very good for documents.  For pictures, use DitherCommand
      DynamicThresholdCommand threshold = new DynamicThresholdCommand();
      
      using (FileStream outstm = new FileStream("path-to-output.tif", FileMode.Create)) {
          while (source.HasMoreImages()) {
              AtalaImage image = source.AcquireNext();
              AtalaImage finalImage = image;
              // convert when needed.
              if (image.PixelFormat != PixelFormat.Pixel1bppIndexed) {
                  finalImage = threshold.Apply().Image;
              }
              encoder.Save(outstm, finalImage, null);
              if (finalImage != image) {
                  finalImage.Dispose();
              }
              source.Release(image);
          }
      }
      

      就目前而言,鲍勃·鲍威尔 (Bob Powell) 的示例很好,但它存在许多问题,其中最重要的是它使用了一个简单的阈值,如果您想要速度并且实际上并不在意,那就太棒了你的输出看起来像什么,或者你的输入域已经是黑白的了——只是用颜色表示。二值化是一个棘手的问题。当您的任务是将可用信息减少 1/24 时,如何保留正确的信息并丢弃其余信息是一个挑战。 DotImage 有六种不同的二值化工具(IIRC)。在我看来,SimpleThreshold 是桶底。

      【讨论】:

        【解决方案3】:

        我建议在深入编码之前先使用 tiff 和图像实用程序来试验所需的结果。我发现VIPS 是一个方便的工具。下一个选项是研究 LibTIFF 可以做什么。我使用 c# 使用免费的LibTiff.NET 取得了不错的效果(另请参阅stackoverflow)。我对 GDI tiff 功能感到非常失望,尽管您的里程可能会有所不同(我需要缺少的 16 位灰度)。 您也可以使用LibTiff 实用程序(即参见http://www.libtiff.org/man/tiffcp.1.html

        【讨论】:

          【解决方案4】:

          我看到了上面的代码,它看起来像是在用手动逻辑转换每个像素。

          这对你有用吗?

          导入 System.Drawing.Imaging

          '获取颜色tif文件

          将 bmpColorTIF 调暗为新位图("C:\color.tif")

          '选择tif的一个区域(将抓取所有帧)

          Dim rectColorTIF As New Rectangle(0, 0, bmpColorTIF.Width, bmpColorTIF.Height )

          '将矩形克隆为 1 位颜色 tif

          Dim bmpBlackWhiteTIF As Bitmap = bmpColorTIF.Clone(rectColorTIF, PixelFormat.Format1bppIndexed)

          '用新的位图做你想做的事(保存等)

          ...

          注意:有大量像素格式可供选择。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            • 2010-09-05
            • 2019-02-24
            • 2010-12-14
            • 2013-03-09
            • 1970-01-01
            相关资源
            最近更新 更多