/// <summary> /// Writes the bitmap information to the binary stream. /// </summary> /// <param name="writer"> /// The <see cref="EndianBinaryWriter"/> containing the stream to write to. /// </param> /// <param name="infoHeader"> /// The <see cref="BmpFileHeader"/> containing the detailed information about the image. /// </param> private void WriteInfo(EndianBinaryWriter writer, BmpInfoHeader infoHeader) { writer.Write(infoHeader.HeaderSize); writer.Write(infoHeader.Width); writer.Write(infoHeader.Height); writer.Write(infoHeader.Planes); writer.Write(infoHeader.BitsPerPixel); writer.Write((int)infoHeader.Compression); writer.Write(infoHeader.ImageSize); writer.Write(infoHeader.XPelsPerMeter); writer.Write(infoHeader.YPelsPerMeter); writer.Write(infoHeader.ClrUsed); writer.Write(infoHeader.ClrImportant); }
/// <inheritdoc/> public void Encode(ImageBase image, Stream stream) { Guard.NotNull(image, nameof(image)); Guard.NotNull(stream, nameof(stream)); int rowWidth = image.Width; int amount = (image.Width * 3) % 4; if (amount != 0) { rowWidth += 4 - amount; } using (BinaryWriter writer = new BinaryWriter(stream)) { BmpFileHeader fileHeader = new BmpFileHeader { Type = 19778, // BM Offset = 54, FileSize = 54 + (image.Height * rowWidth * 3) }; WriteHeader(writer, fileHeader); BmpInfoHeader infoHeader = new BmpInfoHeader { HeaderSize = 40, Height = image.Height, Width = image.Width, BitsPerPixel = 24, Planes = 1, Compression = BmpCompression.RGB, ImageSize = image.Height * rowWidth * 3, ClrUsed = 0, ClrImportant = 0 }; WriteInfo(writer, infoHeader); this.WriteImage(writer, image); writer.Flush(); } }
/// <summary> /// Encodes the image to the specified stream from the <see cref="ImageBase{T,TP}"/>. /// </summary> /// <typeparam name="T">The pixel format.</typeparam> /// <typeparam name="TP">The packed format. <example>long, float.</example></typeparam> /// <param name="image">The <see cref="ImageBase{T,TP}"/> to encode from.</param> /// <param name="stream">The <see cref="Stream"/> to encode the image data to.</param> /// <param name="bitsPerPixel">The <see cref="BmpBitsPerPixel"/></param> public void Encode <T, TP>(ImageBase <T, TP> image, Stream stream, BmpBitsPerPixel bitsPerPixel) where T : IPackedVector <TP> where TP : struct { Guard.NotNull(image, nameof(image)); Guard.NotNull(stream, nameof(stream)); this.bmpBitsPerPixel = bitsPerPixel; // Cast to int will get the bytes per pixel short bpp = (short)(8 * (int)bitsPerPixel); int bytesPerLine = 4 * (((image.Width * bpp) + 31) / 32); this.padding = bytesPerLine - (image.Width * (int)bitsPerPixel); // Do not use IDisposable pattern here as we want to preserve the stream. EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Little, stream); BmpInfoHeader infoHeader = new BmpInfoHeader { HeaderSize = BmpInfoHeader.Size, Height = image.Height, Width = image.Width, BitsPerPixel = bpp, Planes = 1, ImageSize = image.Height * bytesPerLine, ClrUsed = 0, ClrImportant = 0 }; BmpFileHeader fileHeader = new BmpFileHeader { Type = 19778, // BM Offset = 54, FileSize = 54 + infoHeader.ImageSize }; WriteHeader(writer, fileHeader); this.WriteInfo(writer, infoHeader); this.WriteImage(writer, image); writer.Flush(); }
/// <summary> /// Reads the <see cref="BmpInfoHeader"/> from the stream. /// </summary> private void ReadInfoHeader() { byte[] data = new byte[BmpInfoHeader.Size]; this.currentStream.Read(data, 0, BmpInfoHeader.Size); this.infoHeader = new BmpInfoHeader { HeaderSize = BitConverter.ToInt32(data, 0), Width = BitConverter.ToInt32(data, 4), Height = BitConverter.ToInt32(data, 8), Planes = BitConverter.ToInt16(data, 12), BitsPerPixel = BitConverter.ToInt16(data, 14), ImageSize = BitConverter.ToInt32(data, 20), XPelsPerMeter = BitConverter.ToInt32(data, 24), YPelsPerMeter = BitConverter.ToInt32(data, 28), ClrUsed = BitConverter.ToInt32(data, 32), ClrImportant = BitConverter.ToInt32(data, 36), Compression = (BmpCompression)BitConverter.ToInt32(data, 16) }; }
/// <summary> /// Writes the bitmap information to the binary stream. /// </summary> /// <param name="writer"> /// The <see cref="BinaryWriter"/> containing the stream to write to. /// </param> /// <param name="infoHeader"> /// The <see cref="BmpFileHeader"/> containing the detailed information about the image. /// </param> private static void WriteInfo(BinaryWriter writer, BmpInfoHeader infoHeader) { writer.Write(infoHeader.HeaderSize); writer.Write(infoHeader.Width); writer.Write(infoHeader.Height); writer.Write(infoHeader.Planes); writer.Write(infoHeader.BitsPerPixel); writer.Write((int)infoHeader.Compression); writer.Write(infoHeader.ImageSize); writer.Write(infoHeader.XPelsPerMeter); writer.Write(infoHeader.YPelsPerMeter); writer.Write(infoHeader.ClrUsed); writer.Write(infoHeader.ClrImportant); }