0

必要なのは、G4圧縮を使用しながら、TIFFファイルを取得して開き、新しいファイルにコピーすることだけです。

そこで、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です。

私は何を間違えましたか?

4

1 に答える 1

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ラスターでない場合、コードは失敗することに注意してください。

なぜ圧縮データを同じコードに渡したいのかは不明です。

于 2012-10-23T11:09:16.250 に答える