【问题标题】:Using .net c# to convert image from jpg to a specific TIFF format使用 .net c# 将图像从 jpg 转换为特定的 TIFF 格式
【发布时间】:2020-02-18 18:39:12
【问题描述】:

我正在尝试将图像发送到 AS-400,它只接受 TIFF 图像。 我正在转换它们,但随后它抱怨

错误是抱怨“无法识别的 tiff 标签...”前两个是 317 和 531 另外:“对于错误代码X'8F0E'和X'8F0F',检测到不符合解压算法规则的位模式。无法进一步解压。验证输入数据的数据完整性 流并再次尝试请求。”

我有一个有效的 tiff 文件,这是它的详细信息:

我正在使用我修改过的 MSDN 代码。 下面的代码是有效的,但我现在需要在编码器中有多个参数。

                Bitmap myBitmap;
                ImageCodecInfo myImageCodecInfo;
                Encoder myEncoder;
                EncoderParameter myEncoderParameter;
                EncoderParameters myEncoderParameters;

                // Create a Bitmap object based on a BMP file.
                myBitmap = new Bitmap(@"f:\testFromBlob.jpg");
                // Get an ImageCodecInfo object that represents the TIFF codec.
                myImageCodecInfo = GetEncoderInfo("image/tiff");
                //do the actual work
                myEncoder = Encoder.Compression;
                myEncoderParameters = new EncoderParameters(1);
                myEncoderParameter = new EncoderParameter(myEncoder,(long)EncoderValue.CompressionCCITT4);
                myEncoderParameters.Param[0] = myEncoderParameter;
                myBitmap.Save(@"f:\resultFromDotNet.tiff", myImageCodecInfo, myEncoderParameters);


  private static ImageCodecInfo GetEncoderInfo(String mimeType)
            {
                int j;
                ImageCodecInfo[] encoders;
                encoders = ImageCodecInfo.GetImageEncoders();
                for (j = 0; j < encoders.Length; ++j)
                {
                    if (encoders[j].MimeType == mimeType)
                        return encoders[j];
                }
                return null;
            }

我对图像文件感到不知所措。 谁能告诉我如何进行与我的测试图像中的设置相匹配的转换?

我已尝试将位深度更改为 1 以及压缩,但不确定但我认为可能需要同时更改。

更新 - 使用 Magick 我可以使用以下方法转换为工作格式

magick 转换 image01.jpg -compress Group4 tiff3.tiff

如果这有助于我走上 C# / .Net 的正确轨道

更新 2:上面的代码正在运行,但我需要知道如何更改多个参数而不是一个。我认为这可能是本垒打。

更新 3:我有多个参数工作,将其发布在这里以防它帮助其他人。现在只需要等待客户进来看看这是否适合他们!

这里是 MS 文档的链接供参考

https://docs.microsoft.com/en-us/dotnet/api/system.drawing.imaging.encoder.colordepth?view=netframework-4.8

            Bitmap myBitmap;
        ImageCodecInfo myImageCodecInfo;
        Encoder compressionEncoder;
        Encoder colorDepthEncoder;
        EncoderParameter compressionParameter;
        EncoderParameter colorDepthParameter;
        EncoderParameters myEncoderParameters;

        // Create a Bitmap object based on a BMP file.
        myBitmap = new Bitmap(@"f:\colorTest.jpg");

        // Get an ImageCodecInfo object that represents the TIFF codec.
        myImageCodecInfo = GetEncoderInfo("image/tiff");
        //do the actual work
        compressionEncoder = Encoder.Compression;
        myEncoderParameters = new EncoderParameters(2);
        compressionParameter = new EncoderParameter(compressionEncoder,(long)EncoderValue.CompressionCCITT4);

        colorDepthEncoder = Encoder.ColorDepth;
        colorDepthParameter = new EncoderParameter(colorDepthEncoder, 24L); //if needed this can be removed

        myEncoderParameters.Param[0] = compressionParameter;
        myEncoderParameters.Param[1] = colorDepthParameter;
        myBitmap.Save(@"f:\resultFromDotNet1bit.tiff", myImageCodecInfo, myEncoderParameters);

【问题讨论】:

  • 看起来您的样本可能有错误。如果您将参数设置为EncoderValue.CompressionCCITT4,您将需要Encoder.Compression 而不是Encoder.ColorDepth。另外,“坏”TIFF 的细节是什么样的?
  • 好收获。我在想我可能需要弄清楚如何处理多个参数(例如压缩和颜色深度)。但是您的提示确实解决了压缩问题!现在我只需要两个都得到
  • @wiz -- 如果您使用 ColorDepth vs Compression 写下关于我的提及,那将是公认的答案。这就是让我重回正轨所需要的一切,我们非常感谢!
  • 太棒了 - 很高兴它有帮助。
  • 刚刚注意到您的编辑显示使用 CCITT4 将颜色深度设置为 24。我相信 CCITT4 只支持 1 位色深。不确定它是否只是一个例子,或者它是否会导致未来的问题。

标签: c# .net tiff


【解决方案1】:

在您的原始代码示例中 - 您可能希望将参数 Encoder.Compression 设置为 EncoderValue.CompressionCCITT4,而不是 Encoder.ColorDepth。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多