Пример #1
0
        private void WriteBMPFile(string fileName, DDSFile ddsFile, BC1CompressionFormat compressionFormat)
        {
            using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
            {
                byte[] BMPMagicNumber = { 0x42, 0x4D };

                int BMPFileHeaderSize     = 14;
                int BMPFileInfoHeaderSize = 40;

                int imageRawSize = (int)ddsFile.DDSHeader.Width * (int)ddsFile.DDSHeader.Height * 3;
                int fileSize     = imageRawSize + BMPFileHeaderSize + BMPFileInfoHeaderSize;

                var bmpFile = new BMPFile();
                bmpFile.BMPFileHeader                 = new BMPFileHeader();
                bmpFile.BMPFileHeader.MagicHeader     = BMPMagicNumber;
                bmpFile.BMPFileHeader.Reserved1       = 0;
                bmpFile.BMPFileHeader.Reserved2       = 0;
                bmpFile.BMPFileHeader.FileSize        = (uint)fileSize;
                bmpFile.BMPFileHeader.OffToPixelArray = (uint)BMPFileHeaderSize + (uint)BMPFileInfoHeaderSize;

                bmpFile.BMPFileInfoHeader                         = new BMPFileInfoHeader();
                bmpFile.BMPFileInfoHeader.HeaderSize              = (uint)BMPFileInfoHeaderSize;
                bmpFile.BMPFileInfoHeader.Width                   = ddsFile.DDSHeader.Width;
                bmpFile.BMPFileInfoHeader.Height                  = ddsFile.DDSHeader.Height;
                bmpFile.BMPFileInfoHeader.ColorPlanes             = 1;
                bmpFile.BMPFileInfoHeader.BitCount                = 24;
                bmpFile.BMPFileInfoHeader.CompressionType         = 0;
                bmpFile.BMPFileInfoHeader.RawDataSize             = (uint)imageRawSize;
                bmpFile.BMPFileInfoHeader.HorizontalPixelPerMeter = 2835;
                bmpFile.BMPFileInfoHeader.VerticalPixelPerMeter   = 2835;
                bmpFile.BMPFileInfoHeader.ColorsUsed              = 0;
                bmpFile.BMPFileInfoHeader.ImportantColors         = 0;

                writer.Write(bmpFile.BMPFileHeader.MagicHeader);
                writer.Write(bmpFile.BMPFileHeader.FileSize);
                writer.Write(bmpFile.BMPFileHeader.Reserved1);
                writer.Write(bmpFile.BMPFileHeader.Reserved2);
                writer.Write(bmpFile.BMPFileHeader.OffToPixelArray);


                writer.Write(bmpFile.BMPFileInfoHeader.HeaderSize);
                writer.Write(bmpFile.BMPFileInfoHeader.Width);
                writer.Write(bmpFile.BMPFileInfoHeader.Height);
                writer.Write(bmpFile.BMPFileInfoHeader.ColorPlanes);
                writer.Write(bmpFile.BMPFileInfoHeader.BitCount);
                writer.Write(bmpFile.BMPFileInfoHeader.CompressionType);
                writer.Write(bmpFile.BMPFileInfoHeader.RawDataSize);
                writer.Write(bmpFile.BMPFileInfoHeader.HorizontalPixelPerMeter);
                writer.Write(bmpFile.BMPFileInfoHeader.VerticalPixelPerMeter);
                writer.Write(bmpFile.BMPFileInfoHeader.ColorsUsed);
                writer.Write(bmpFile.BMPFileInfoHeader.ImportantColors);

                bmpFile.PixelData = new byte[imageRawSize];

                int numberOfVerticalBlocks   = (int)ddsFile.DDSHeader.Height / Constants.BlockDimension;
                int numberOfHorizontalBlocks = (int)ddsFile.DDSHeader.Width / Constants.BlockDimension;
                int numberOfBlocks           = numberOfVerticalBlocks * numberOfHorizontalBlocks;

                for (int i = 0; i < numberOfBlocks; ++i)
                {
                    var blockIndex  = Helpers.ToColumnMajor(i, numberOfHorizontalBlocks);
                    var blockData   = ddsFile.GetBlockData(blockIndex);
                    var blockColors = compressionFormat.Decompress(blockData);

                    bmpFile.SetBlockColors(blockIndex, blockColors);
                }

                writer.Write(bmpFile.PixelData.FlipArrayHorizontal((int)bmpFile.BMPFileInfoHeader.Height));
            }
        }