Как управлять значением смещения первого IFD заголовка изображения TIFF при генерации TIFF?
Я хотел бы знать, есть ли способ контролировать 4 byte data
в TIFF
заголовок изображения, в котором хранится 1-й IFD offset
значение.
У меня есть ситуация, когда я сканирую три разных изображения и сохраняю их непосредственно в файловую систему, это приходит со значением [4949 002A 00000080] (hex)
Но, используя libTiff .net api
, когда я объединяю все три изображения и создаю одно TIFF
последние четыре байта в заголовке идут со случайным значением, которое является 1-м IFD offset
,
У меня есть требование, где 1-й IFD offset
должно быть 00000080. Я использую C# с libTiff
.net api для генерации 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, grey.tif и tail.tif имеют правильные данные заголовка. [4949 002A 00000080] (гексан)
Ниже код использует API libTiff.net, чтобы связать все изображения и создать одно изображение 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]
Stackru ответ о звонке output.CheckpointDirectory();
перед записью любых данных в файл. Я также попробовал этот метод и обнаружил, что теперь последние четыре байта заголовка изменены, и он всегда такой же, как раньше, раньше он всегда был случайным. Теперь я получаю 00000010
Спасибо