【问题标题】:Repacking TIFF using LibTiff.Net in Silverlight在 Silverlight 中使用 LibTiff.Net 重新打包 TIFF
【发布时间】:2012-10-23 02:53:45
【问题描述】:

我只需要获取 TIFF 文件,打开它并在使用 G4 压缩时复制到新文件。

所以,我采用了 LibTiff.Net 和 TiffCP 实用程序。我已尽力从 TIffCP 转换代码,这是我拥有的功能:

public static byte[] ConvertToG4Tiff(byte[] input)
{
    var c = new Copier();

    // Set compression to g4
    if (!c.ProcessCompressOptions("g4")) return null;

    // Open output tiff
    var memoryStream = new MemoryStream();
    var tiffStream = new TiffStream();
    using (var outImage = Tiff.ClientOpen(string.Empty, "w", memoryStream, tiffStream))
    {
        using (var inImage = Tiff.ClientOpen(string.Empty, "read", new MemoryStream(input), new TiffStream()))
        {
            if (inImage == null) return null;

            int totalPages = inImage.NumberOfDirectories();
            for (var i = 0; i < totalPages;)
            {
                c.m_config = PlanarConfig.UNKNOWN;
                c.m_compression = c.m_defcompression;
                c.m_predictor = c.m_defpredictor;
                c.m_fillorder = 0;
                c.m_rowsperstrip = 0;
                c.m_tilewidth = -1;
                c.m_tilelength = -1;
                c.m_g3opts = c.m_defg3opts;

                if (!inImage.SetDirectory((short)i)) return null;
                if (!c.Copy(inImage, outImage) || !outImage.WriteDirectory()) return null;

                i++;
            }
        }

        var retVal = new byte[tiffStream.Size(memoryStream)];
        tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
        return retVal;
    }
}

我认为最后 3 行是我搞砸的地方。我确实得到了有效的字节数组(有数据,大约是原始未压缩 TIFF 的 10%)

当我再次尝试使用代码打开它时 - 它不会打开。通过这个相同的函数传递这个新数组是行不通的。打开的对象为 NULL。

我做错了什么?

【问题讨论】:

    标签: c# silverlight tiff libtiff.net


    【解决方案1】:

    您应该使用memoryStream 来检索压缩数据。不要在这样的代码中使用tiffStream

    所以,

    var retVal = new byte[tiffStream.Size(memoryStream)];
    tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
    return retVal;
    

    应该改成

    var retVal = memoryStream.ToArray();
    return retVal;
    

    还请注意,您的代码不会转换数据,因此如果输入字节不是 1bpp 光栅,则代码将失败。

    不清楚为什么要将压缩数据传递给相同的代码。

    【讨论】:

    • 是的,像这样更改代码有效!我将压缩数据传递给相同的代码只是为了测试我是否有有效的输出,这不在最终代码中。感谢您的转换评论。我需要深入研究 TIFF 规范,但我认为这会很好。我正在与拥有大量文档库的客户合作,他们都扫描未压缩......这就是我正在测试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多