private void LoadBitmap(Stream stream) { ValidateStream(stream); var reader = new BinaryReader(stream); // Read the header. _header = (TGA_HEADER)reader.ReadStruct(typeof(TGA_HEADER)); /*long t = stream.Position; BinaryWriter wr = new BinaryWriter(stream, Encoding.ASCII); if (!header.HasColorMap) { header.colormaplength = 0; header.colormapstart = 0; stream.Position = 0; wr.WriteStruct(header); }*/ // stream.Position = t; if (_header.identsize > 0) { var imageId = reader.ReadBytes(_header.identsize); Debug.WriteLine("Has ImageID: " + Encoding.ASCII.GetString(imageId)); } // Check if we know the image data type. if (!Enum.IsDefined(typeof(TgaPixelFormat), PixelFormat)) throw new Exception("Unknown image data type."); // Check if color map is needed by data type and load it if available. var colorMap = new byte[0]; if (PixelFormat == TgaPixelFormat.Indexed) if (!HasPalette) throw new Exception("No color map is defined."); else colorMap = reader.ReadBytes((PaletteBits / 8) * _header.colormaplength); // Check if file has footer var tempPos = stream.Position; stream.Seek(-26, SeekOrigin.End); var footer = (TGA_FOOTER)reader.ReadStruct(typeof(TGA_FOOTER)); stream.Position = tempPos; _fileVersion = TgaFileVersion.Version1; if (footer.IsValidFooter) _fileVersion = TgaFileVersion.Version2; _bitmap = null; switch (_header.bits) { case 32: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); break; case 24: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); break; case 16: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555); break; case 8: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); // Load palette from image data. if (HasPalette && PixelFormat == TgaPixelFormat.Indexed) { var bytesPerColor = PaletteBits / 8; for (var i = _header.colormapstart + bytesPerColor - 1; i < colorMap.Length; i += bytesPerColor) { var colorIndex = i/bytesPerColor; if (colorIndex < _bitmap.Palette.Entries.Length) _bitmap.Palette.Entries[colorIndex] = Color.FromArgb(colorMap[i], colorMap[i - 1], colorMap[i - 2]); else throw new Exception("Unexpected length of color palette."); } } else if (PixelFormat == TgaPixelFormat.Greyscale) { // Build a 256 color palette of grey colors. for (var i = 0; i < _bitmap.Palette.Entries.Length; i++) _bitmap.Palette.Entries[i] = Color.FromArgb(i, i, i); } break; } if (_bitmap == null) throw new NotSupportedException("The tga image format is not supported."); ReadPixels(_bitmap, Compressed ? new TruevisionRleReader(reader.BaseStream, _bitmap.PixelFormat) : reader, BottomToTop ); if (_fileVersion == TgaFileVersion.Version2) { if (footer.developerDirectoryOffset > 0) { stream.Seek(footer.developerDirectoryOffset, SeekOrigin.Begin); } if (footer.extensionAreaOffset > 0) { //char[] trimChars = " \0".ToCharArray(); stream.Seek(footer.extensionAreaOffset, SeekOrigin.Begin); var extension = (TGA_EXTENSION)reader.ReadStruct(typeof(TGA_EXTENSION)); // Debug.WriteLine("Generated by software: " + extension.softwareID + " v." + (float)extension.softwareVersionNumber / 100); } var bytesToPreserve = reader.ReadBytes((int)(stream.Length - 26 - stream.Position)); // Debug.WriteLine(System.Text.Encoding.ASCII.GetString(bytesToPreserve)); } }
private void LoadBitmap(Stream stream) { ValidateStream(stream); var reader = new BinaryReader(stream); // Read the header. _header = (TGA_HEADER)reader.ReadStruct(typeof(TGA_HEADER)); /*long t = stream.Position; * BinaryWriter wr = new BinaryWriter(stream, Encoding.ASCII); * if (!header.HasColorMap) * { * header.colormaplength = 0; * header.colormapstart = 0; * stream.Position = 0; * wr.WriteStruct(header); * }*/ // stream.Position = t; if (_header.identsize > 0) { var imageId = reader.ReadBytes(_header.identsize); Debug.WriteLine("Has ImageID: " + Encoding.ASCII.GetString(imageId)); } // Check if we know the image data type. if (!Enum.IsDefined(typeof(TgaPixelFormat), PixelFormat)) { throw new Exception("Unknown image data type."); } // Check if color map is needed by data type and load it if available. var colorMap = new byte[0]; if (PixelFormat == TgaPixelFormat.Indexed) { if (!HasPalette) { throw new Exception("No color map is defined."); } else { colorMap = reader.ReadBytes((PaletteBits / 8) * _header.colormaplength); } } // Check if file has footer var tempPos = stream.Position; stream.Seek(-26, SeekOrigin.End); var footer = (TGA_FOOTER)reader.ReadStruct(typeof(TGA_FOOTER)); stream.Position = tempPos; _fileVersion = TgaFileVersion.Version1; if (footer.IsValidFooter) { _fileVersion = TgaFileVersion.Version2; } _bitmap = null; switch (_header.bits) { case 32: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); break; case 24: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); break; case 16: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555); break; case 8: _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); // Load palette from image data. if (HasPalette && PixelFormat == TgaPixelFormat.Indexed) { var bytesPerColor = PaletteBits / 8; for (var i = _header.colormapstart + bytesPerColor - 1; i < colorMap.Length; i += bytesPerColor) { var colorIndex = i / bytesPerColor; if (colorIndex < _bitmap.Palette.Entries.Length) { _bitmap.Palette.Entries[colorIndex] = Color.FromArgb(colorMap[i], colorMap[i - 1], colorMap[i - 2]); } else { throw new Exception("Unexpected length of color palette."); } } } else if (PixelFormat == TgaPixelFormat.Greyscale) { // Build a 256 color palette of grey colors. for (var i = 0; i < _bitmap.Palette.Entries.Length; i++) { _bitmap.Palette.Entries[i] = Color.FromArgb(i, i, i); } } break; } if (_bitmap == null) { throw new NotSupportedException("The tga image format is not supported."); } ReadPixels(_bitmap, Compressed ? new TruevisionRleReader(reader.BaseStream, _bitmap.PixelFormat) : reader, BottomToTop ); if (_fileVersion == TgaFileVersion.Version2) { if (footer.developerDirectoryOffset > 0) { stream.Seek(footer.developerDirectoryOffset, SeekOrigin.Begin); } if (footer.extensionAreaOffset > 0) { //char[] trimChars = " \0".ToCharArray(); stream.Seek(footer.extensionAreaOffset, SeekOrigin.Begin); var extension = (TGA_EXTENSION)reader.ReadStruct(typeof(TGA_EXTENSION)); // Debug.WriteLine("Generated by software: " + extension.softwareID + " v." + (float)extension.softwareVersionNumber / 100); } var bytesToPreserve = reader.ReadBytes((int)(stream.Length - 26 - stream.Position)); // Debug.WriteLine(System.Text.Encoding.ASCII.GetString(bytesToPreserve)); } }