Example #1
0
        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);
        }
Example #2
0
        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);
        }