简体   繁体   English

在Silverlight中使用LibTiff.Net重新包装TIFF

[英]Repacking TIFF using LibTiff.Net in Silverlight

All I need is to take TIFF file, open it and copy to new file while using G4 compression. 我需要做的就是获取TIFF文件,将其打开并在使用G4压缩时复制到新文件。

So, I took LibTiff.Net and TiffCP utility. 因此,我使用了LibTiff.Net和TiffCP实用程序。 Did my best to convert code from TIffCP and here is function I have: 尽我最大的努力从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;
    }
}

I think last 3 lines is where I messed up. 我认为最后3行是我搞砸的地方。 I do get valid byte array back (There is data and it's about 10% of original uncompressed TIFF) 我确实得到了有效的字节数组(有数据,大约是原始未压缩TIFF的10%)

When I try to open it with code again - it won't open. 当我尝试再次使用代码打开它时-它不会打开。 Passing this new array through this same function will not work. 通过相同的函数传递此新数组将不起作用。 Opened object is NULL. 打开的对象为NULL。

What did I do wrong? 我做错了什么?

You are supposed to use memoryStream to retrieve compressed data. 您应该使用memoryStream来检索压缩数据。 Do not use tiffStream for anything in a code like this. 请勿将tiffStream用于此类代码中的任何内容。

So, the 所以

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

should probably be changed to 应该应该更改为

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

Please also note that your code won't convert data so if input bytes are not 1bpp raster than the code will fail. 另请注意,您的代码不会转换数据,因此,如果输入字节不是1bpp栅格,则代码将失败。

It's unclear why would you want to pass compressed data to the same code. 目前尚不清楚为什么要将压缩数据传递给同一代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM