private unsafe static void CopyData2Array(BigTiffDirectoryEntry src, int length, byte[] distData, int offset) { int max = offset + length; int distOff = offset; if (distData.Length >= max) { byte[] data = BitConverter.GetBytes(src.TagID); Array.Copy(data, 0, distData, distOff, sizeof(ushort)); distOff += sizeof(ushort); data = BitConverter.GetBytes(src.DataType); Array.Copy(data, 0, distData, distOff, sizeof(ushort)); distOff += sizeof(ushort); data = BitConverter.GetBytes(src.Count); Array.Copy(data, 0, distData, distOff, sizeof(ulong)); distOff += sizeof(ulong); data = BitConverter.GetBytes(src.DataOrPtr); Array.Copy(data, 0, distData, distOff, sizeof(ulong)); distOff += sizeof(ulong); } }
private static unsafe void CopyData2Array(BigTiffDirectoryEntry src, int length, byte[] distData, int offset) { int max = offset + length; int distOff = offset; if (distData.Length >= max) { byte[] data = BitConverter.GetBytes(src.TagID); Array.Copy(data, 0, distData, distOff, sizeof(ushort)); distOff += sizeof(ushort); data = BitConverter.GetBytes(src.DataType); Array.Copy(data, 0, distData, distOff, sizeof(ushort)); distOff += sizeof(ushort); data = BitConverter.GetBytes(src.Count); Array.Copy(data, 0, distData, distOff, sizeof(ulong)); distOff += sizeof(ulong); data = BitConverter.GetBytes(src.DataOrPtr); Array.Copy(data, 0, distData, distOff, sizeof(ulong)); distOff += sizeof(ulong); } }
public unsafe void WriteBigTiffHeader() { //IFH BigTiffImageFileHeader ifh = new BigTiffImageFileHeader(); ifh.ByteOrder = 0x4949; ifh.Marker = 0x002B; ifh.OffsetByteSize = 0x0008; ifh.FirstIFD = 0x00000010; //第一个IFD,这里只一个 BigTiffImageFileDirectory ifd = new BigTiffImageFileDirectory(); ifd.DECount = 10; ifd.NextIFD = 0; int headerLength = sizeof(BigTiffImageFileHeader) + Marshal.SizeOf(ifd.DECount) + BIGTIFF_DE_LENGTH * (int)ifd.DECount + Marshal.SizeOf(ifd.NextIFD); //tiff文件头长度,不包含DE的数据部分,按1个IFD,10个DE计算 int headerDataLength = 0;//DE的数据部分长度, int headerDataOffset = headerLength;//DE的数据部分偏移量 this._ImageDataOffset = headerLength + headerDataLength; byte[] headerData = new byte[this._ImageDataOffset]; //IFH CopyData2Array((byte*)&ifh, sizeof(BigTiffImageFileHeader), headerData, 0); //IFD CopyData2Array((byte*)&(ifd.DECount), Marshal.SizeOf(ifd.DECount), headerData, sizeof(BigTiffImageFileHeader)); //DE #region 开始逐条添加DE int deLength = BIGTIFF_DE_LENGTH; int deOffset = sizeof(BigTiffImageFileHeader) + Marshal.SizeOf(ifd.DECount); fixed (BigTiffDirectoryEntry* deArray = new BigTiffDirectoryEntry[ifd.DECount]) { int idx = 0; //图像宽 deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.ImageWidth, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = this._width }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //图像高 idx = 1; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.ImageLength, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = this._height }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //颜色深度 idx = 2; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.BitsPerSample, DataType = (ushort)TiffDEDataType.SHORT, Count = 3L, DataOrPtr = 0x000800080008 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //图片压缩 idx = 3; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.Compression, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 1 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //颜色空间 idx = 4; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.PhotometricInterpretation, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 2 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //图像扫描线偏移量 idx = 5; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.StripOffsets, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = (uint)headerData.Length }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //方向 idx = 6; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.Orientation, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 1 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //每像素样本 idx = 7; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.SamplesPerPixel, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 3 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //每块行数 idx = 8; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.RowsPerStrip, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = this._height }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //每块的字节数 idx = 9; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.StripByteCounts, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = (ulong)this.ImageDataLength }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); } #endregion _fs.Write(headerData, 0, headerData.Length); }
public unsafe void WriteBigTiffHeader() { //IFH BigTiffImageFileHeader ifh = new BigTiffImageFileHeader(); ifh.ByteOrder = 0x4949; ifh.Marker = 0x002B; ifh.OffsetByteSize = 0x0008; ifh.FirstIFD = 0x00000010; //第一个IFD,这里只一个 BigTiffImageFileDirectory ifd = new BigTiffImageFileDirectory(); ifd.DECount = 10; ifd.NextIFD = 0; int headerLength = sizeof(BigTiffImageFileHeader) + Marshal.SizeOf(ifd.DECount) + BIGTIFF_DE_LENGTH * (int)ifd.DECount + Marshal.SizeOf(ifd.NextIFD); //tiff文件头长度,不包含DE的数据部分,按1个IFD,10个DE计算 int headerDataLength = 0; //DE的数据部分长度, int headerDataOffset = headerLength; //DE的数据部分偏移量 this._ImageDataOffset = headerLength + headerDataLength; byte[] headerData = new byte[this._ImageDataOffset]; //IFH CopyData2Array((byte *)&ifh, sizeof(BigTiffImageFileHeader), headerData, 0); //IFD CopyData2Array((byte *)&(ifd.DECount), Marshal.SizeOf(ifd.DECount), headerData, sizeof(BigTiffImageFileHeader)); //DE #region 开始逐条添加DE int deLength = BIGTIFF_DE_LENGTH; int deOffset = sizeof(BigTiffImageFileHeader) + Marshal.SizeOf(ifd.DECount); fixed(BigTiffDirectoryEntry *deArray = new BigTiffDirectoryEntry[ifd.DECount]) { int idx = 0; //图像宽 deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.ImageWidth, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = this._width }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //图像高 idx = 1; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.ImageLength, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = this._height }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //颜色深度 idx = 2; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.BitsPerSample, DataType = (ushort)TiffDEDataType.SHORT, Count = 3L, DataOrPtr = 0x000800080008 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //图片压缩 idx = 3; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.Compression, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 1 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //颜色空间 idx = 4; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.PhotometricInterpretation, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 2 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //图像扫描线偏移量 idx = 5; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.StripOffsets, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = (uint)headerData.Length }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //方向 idx = 6; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.Orientation, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 1 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //每像素样本 idx = 7; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.SamplesPerPixel, DataType = (ushort)TiffDEDataType.SHORT, Count = 1L, DataOrPtr = 3 }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //每块行数 idx = 8; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.RowsPerStrip, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = this._height }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); //每块的字节数 idx = 9; deArray[idx] = new BigTiffDirectoryEntry { TagID = (ushort)TiffDETag.StripByteCounts, DataType = (ushort)TiffDEDataType.LONG, Count = 1L, DataOrPtr = (ulong)this.ImageDataLength }; CopyData2Array(deArray[idx], deLength, headerData, deOffset + idx * deLength); } #endregion _fs.Write(headerData, 0, headerData.Length); }