private BMPFile ReadBMPFile(BinaryReader binaryReader) { //create a bmp file for us to handle bmp data BMPFile bmpFile = new BMPFile(); bmpFile.BMPFileHeader = new BMPFileHeader(); bmpFile.BMPFileHeader.MagicHeader = binaryReader.ReadBytes(2); // 2 bmpFile.BMPFileHeader.FileSize = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileHeader.Reserved1 = binaryReader.ReadInt16(); // 2 bmpFile.BMPFileHeader.Reserved2 = binaryReader.ReadInt16(); // 2 bmpFile.BMPFileHeader.OffToPixelArray = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader = new BMPFileInfoHeader(); bmpFile.BMPFileInfoHeader.HeaderSize = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.Width = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.Height = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.ColorPlanes = binaryReader.ReadUInt16(); // 2 bmpFile.BMPFileInfoHeader.BitCount = binaryReader.ReadUInt16(); // 2 bmpFile.BMPFileInfoHeader.CompressionType = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.RawDataSize = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.HorizontalPixelPerMeter = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.VerticalPixelPerMeter = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.ColorsUsed = binaryReader.ReadUInt32(); // 4 bmpFile.BMPFileInfoHeader.ImportantColors = binaryReader.ReadUInt32(); // 4 //we at 54 now //all of the image data bmpFile.PixelData = binaryReader.ReadAllBytes().FlipArrayHorizontal((int)bmpFile.BMPFileInfoHeader.Height); return(bmpFile); }
public void WriteDDSFile(string fileName, BMPFile bmpFile, BC1CompressionFormat compressionFormat) { using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create))) { var ddsFile = new DDSFile(); writer.Write(Constants.DDSMagicNumber); //create default header ddsFile.DDSHeader = CreateHeader((int)bmpFile.BMPFileInfoHeader.Width, (int)bmpFile.BMPFileInfoHeader.Height, Helpers.BC1Unorm()); var headerSize = Marshal.SizeOf(typeof(DDSHeader)); var headerBuffer = new byte[headerSize]; // Populate header data directly from the bytebuffer GCHandle handle = GCHandle.Alloc(headerBuffer, GCHandleType.Pinned); Marshal.StructureToPtr(ddsFile.DDSHeader, handle.AddrOfPinnedObject(), true); handle.Free(); writer.Write(headerBuffer); ddsFile.Data = new byte[ddsFile.DDSHeader.PitchOrLinearSize]; int numberOfPixels = (int)ddsFile.DDSHeader.Width * (int)ddsFile.DDSHeader.Height; int numberOfRequiredBlocks = numberOfPixels / Constants.TexelCount; int bufferSize = numberOfRequiredBlocks * Constants.BC1ByteSize; ddsFile.Data = new byte[bufferSize]; int numberOfVerticalBlocks = (int)bmpFile.BMPFileInfoHeader.Height / Constants.BlockDimension; int numberOfHorizontalBlocks = (int)bmpFile.BMPFileInfoHeader.Width / Constants.BlockDimension; int numberOfBlocks = numberOfVerticalBlocks * numberOfHorizontalBlocks; for (int i = 0; i < numberOfBlocks; ++i) { var blockIndex = Helpers.ToColumnMajor(i, numberOfHorizontalBlocks); var blockColors = bmpFile.GetBlockColors(blockIndex); var blockData = compressionFormat.Compress(blockColors); ddsFile.SetBlockData(blockIndex, blockData); } writer.Write(ddsFile.Data); } }
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)); } }