Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }