0

我想知道有没有办法控制存储第一个值byte data的图像标题中的 4。TIFFIFD offset

我有一种情况,当我扫描三个不同的图像并直接存储到文件系统中时,它带有值[4949 002A 00000080](十六进制)

但是,使用libTiff .net api时,当我将所有三个图像组合并创建一个时TIFF,标头中的最后四个字节带有随机值,即 1st IFD offset

我有一个要求,第一个IFD offset应该是00000080。我正在使用带有libTiff.net api 的 C# 来生成TIFF.

请找到snippet代码:下面的代码使用捕获的图像创建一个 Tiff 文件:

using (FileStream file = new FileStream("C:\\imgs\\front.tif", FileMode.Create, System.IO.FileAccess.Write))
{
    streamBitmapFront.WriteTo(file);
}
using (FileStream file = new FileStream("C:\\imgs\\gray.tif", FileMode.Create, System.IO.FileAccess.Write))
{
    streamBitmapFront2.WriteTo(file);
}

using (FileStream file = new FileStream("C:\\imgs\\rear.tif", FileMode.Create, System.IO.FileAccess.Write))
{
    streamBitmapRear.WriteTo(file);
}

front.tif、gray.tif 和rear.tif 具有正确的标题数据。[4949 002A 00000080](十六进制)

下面的代码使用 libTiff.net api 绑定所有图像并创建单个 tiff 图像。

using (Tiff output = Tiff.Open( path + uiString + ".IMG", "w"))
{
    using (Tiff header = Tiff.Open("C:\\imgs\\gray.tif", "r"))
    {
        WritePage(output, header, 1, 3, uiString);
    }
    using (Tiff header = Tiff.Open("C:\\imgs\\front.tif", "r"))
    {
        WritePage(output, header, 2, 3, uiString);
    }
    using (Tiff header = Tiff.Open("C:\\imgs\\rear.tif", "r"))
    {
        WritePage(output, header, 3, 3, uiString);
    }
}


public static void WritePage(Tiff output, Tiff input, int pageNumber, int numberOfPages, String name)
{
    int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
    int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
    int samplesPerPixel = 1;
    int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
    int scanlineSize = input.ScanlineSize();

    byte[][] buffer = new byte[height][];
    for (int i = 0; i < height; ++i)
    {
        buffer[i] = new byte[scanlineSize];
        input.ReadScanline(buffer[i], i);
    }

    output.SetField(TiffTag.IMAGEWIDTH, width / samplesPerPixel);
    output.SetField(TiffTag.IMAGELENGTH, height);
    output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
    output.SetField(TiffTag.ORIENTATION, BitMiracle.LibTiff.Classic.Orientation.TOPLEFT);
    output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
    output.SetField(TiffTag.SUBFILETYPE, 0);
    output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISWHITE);
    output.SetField(TiffTag.ROWSPERSTRIP, height);

    if (pageNumber == 1)
    {
        output.SetField(TiffTag.STRIPOFFSETS, input.GetField(TiffTag.STRIPOFFSETS)[0].ToIntArray()[0]);
        //output.SetField(TiffTag.COMPRESSION, Compression.JPEG); 
        output.SetField(TiffTag.BITSPERSAMPLE, 8);
        output.SetField(TiffTag.XRESOLUTION, 120.0);
        output.SetField(TiffTag.YRESOLUTION, 120.0);
        output.SetField(TiffTag.DOCUMENTNAME, name + "G.JPEG");

    }
    else
    {
        if ( pageNumber == 2 )
            output.SetField(TiffTag.DOCUMENTNAME, name + "F.TIFF");
        if  (pageNumber == 3 )
            output.SetField(TiffTag.DOCUMENTNAME, name + "R.TIFF");

        output.SetField(TiffTag.BITSPERSAMPLE, 1);
        output.SetField(TiffTag.COMPRESSION, Compression.CCITT_T6);
        output.SetField(TiffTag.XRESOLUTION, 200.0);
        output.SetField(TiffTag.YRESOLUTION, 200.0);
    }


    output.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH);
    output.SetField(TiffTag.SUBFILETYPE, FileType.PAGE);
    output.SetField(TiffTag.PAGENUMBER, pageNumber, numberOfPages);

    for (int i = 0; i < height; ++i)
        output.WriteScanline(buffer[i], i);

    output.WriteDirectory();
}

一旦创建了三页的 TIFF 图像,标题值就会不一致。 [4949 002A 0003B210] (hex)

[更新 1]

Stackoverflow 回答output.CheckpointDirectory();描述了在将任何数据写入文件之前调用。我也尝试了该方法并发现,现在标头的最后四个字节已更改,并且始终相同,不像之前它始终是随机的。现在我得到00000010

谢谢

4

0 回答 0