/// <summary> /// /// </summary> /// <param name="stream"></param> /// <returns></returns> public static DibSection GetDibData(Stream stream) { var data = new DibSection(); var reader = new BinaryReader(stream); reader.BaseStream.Seek(0, SeekOrigin.Begin); if (reader.ReadByte() != 'B' || reader.ReadByte() != 'M') { throw new ArgumentException("Invalid bitmap stream.", "stream"); } reader.BaseStream.Seek(10, SeekOrigin.Begin); var offBits = reader.ReadInt32(); reader.ReadInt32(); // biSize data.Width = reader.ReadInt32(); data.Height = reader.ReadInt32(); reader.ReadInt16(); // biPlanes data.BitCount = reader.ReadInt16(); reader.BaseStream.Seek(offBits, SeekOrigin.Begin); data.pixelsPerY = (((data.Width * (data.BitCount >> 3)) + 3) >> 2) << 2; data.data = reader.ReadBytes(data.pixelsPerY * data.Height); return(data); }
/// <summary> /// /// </summary> /// <param name="stream"></param> /// <returns></returns> public static DibSection GetDibData(Stream stream) { var data = new DibSection(); var reader = new BinaryReader(stream); reader.BaseStream.Seek(0, SeekOrigin.Begin); if (reader.ReadByte() != 'B' || reader.ReadByte() != 'M') { throw new ArgumentException("Invalid bitmap stream.", "stream"); } reader.BaseStream.Seek(10, SeekOrigin.Begin); var offBits = reader.ReadInt32(); reader.ReadInt32(); // biSize data.Width = reader.ReadInt32(); data.Height = reader.ReadInt32(); reader.ReadInt16(); // biPlanes data.BitCount = reader.ReadInt16(); reader.BaseStream.Seek(offBits, SeekOrigin.Begin); data.pixelsPerY = (((data.Width * (data.BitCount >> 3)) + 3) >> 2) << 2; data.data = reader.ReadBytes(data.pixelsPerY * data.Height); return data; }
private void RebuildRegion(Stream stream, Color color) { if (stream == null) { throw new ArgumentNullException("stream"); } if (Region != IntPtr.Zero) { NativeMethods.DeleteObject(Region); } var data = DibSection.GetDibData(stream); if (data.BitCount != 24) { throw new NotSupportedException("Supported only 24 bpp"); } int mask; if (color == Color.Transparent) { mask = data.GetPixel(0, 0); } else { mask = (color.B << 16) | (color.G << 8) | color.R; } Region = NativeMethods.CreateRectRgn(0, 0, 0, 0); for (var y = 0; y < data.Height; y++) { for (var x = 0; x < data.Width; x++) { while ((x < data.Width) && (data.GetPixel(x, y) == mask)) { x++; } var left = x; while ((x < data.Width) && (data.GetPixel(x, y) != mask)) { x++; } if ((x - left) > 0) { var rectRegion = NativeMethods.CreateRectRgn(left, y, x, y + 1); NativeMethods.CombineRgn(Region, Region, rectRegion, RgnCombineMode.RGN_OR); NativeMethods.DeleteObject(rectRegion); } } } }