示例#1
0
        public static IconInfoHeader Read(Stream stream)
        {
            IconInfoHeader iih = new IconInfoHeader();

            iih.Width      = (byte)stream.ReadByte();
            iih.Height     = (byte)stream.ReadByte();
            iih.ColorCount = (byte)stream.ReadByte();
            iih.Reserved1  = (byte)stream.ReadByte();
            byte[] buf = new byte[4];
            stream.Read(buf, 0, 4);
            iih.Reserved2 = BitConverter.ToUInt16(buf, 0);
            iih.Reserved3 = BitConverter.ToUInt16(buf, 2);
            stream.Read(buf, 0, 4);
            iih.icoDIBSize = BitConverter.ToUInt32(buf, 0);
            stream.Read(buf, 0, 4);
            iih.icoDIBOffset = BitConverter.ToUInt32(buf, 0);
            return(iih);
        }
示例#2
0
        private static void SaveCor( Bitmap item, Point hotspot, Stream stream, ushort type, Color transp ) {
            IconFileHeader ifh = new IconFileHeader();
            ifh.icoReserved = 0x0;
            ifh.icoResourceCount = 1;
            ifh.icoResourceType = type;
            ifh.Write( stream );
            IconInfoHeader iif = new IconInfoHeader();
            BITMAPINFOHEADER bih = new BITMAPINFOHEADER();
            iif.Width = (byte)item.Width;
            iif.Height = (byte)item.Height;
            iif.ColorCount = 0;
            iif.Reserved1 = 0;
            iif.Reserved2 = (ushort)hotspot.X;
            iif.Reserved3 = (ushort)hotspot.Y;
#if RGB24
            int linesize = ((item.Width * 24 + 31) / 32) * 4;
#else
            int linesize = ((item.Width * 32 + 31) / 32) * 4;
#endif
            int linesize_mask = ((item.Width * 1 + 31) / 32) * 4;
            int size = linesize * item.Height + linesize_mask * item.Height + 40;
#if DEBUG
            Console.WriteLine( "linesize=" + linesize );
#endif
            iif.icoDIBSize = (uint)size;
            iif.icoDIBOffset = 0x16;
            iif.Write( stream );
            bih.biSize = 40;
            bih.biWidth = item.Width;
#if RGB24
            bih.biHeight = item.Height * 2;
#else
            bih.biHeight = item.Height * 2;
#endif
            bih.biPlanes = 1;
#if RGB24
            bih.biBitCount = 24;
#else
            bih.biBitCount = 32;
#endif
            bih.biCompression = 0;
            bih.biSizeImage = (uint)(linesize * item.Height);
            bih.biXPelsPerMeter = 0;//            (int)(item.HorizontalResolution / 2.54e-2);
            bih.biYPelsPerMeter = 0;//            (int)(item.VerticalResolution / 2.54e-2);
            bih.biClrUsed = 0;
            bih.biClrImportant = 0;
            bih.Write( stream );
            for ( int y = item.Height - 1; y >= 0; y-- ) {
                int count = 0;
                for ( int x = 0; x < item.Width; x++ ) {
                    Color c = item.GetPixel( x, y );
                    stream.WriteByte( (byte)c.B );
                    stream.WriteByte( (byte)c.G );
                    stream.WriteByte( (byte)c.R );
#if DEBUG
                    if ( c.R != transp.R || c.G != transp.G || c.B != transp.B ) {
                        Console.WriteLine( "color=" + c );
                    }
#endif
#if RGB24
                    count += 3;
#else
                    stream.WriteByte( (byte)c.A );
                    count += 4;
#endif
                }
                for ( int i = count; i < linesize; i++ ) {
                    stream.WriteByte( 0x0 );
                }
            }

            for ( int y = item.Height - 1; y >= 0; y-- ) {
                int count = 0;
                byte v = 0x0;
                int tcount = 0;
                for ( int x = 0; x < item.Width; x++ ) {
                    Color c = item.GetPixel( x, y );
                    byte tr = 0x0;
                    if ( c.R == transp.R && c.G == transp.G && c.B == transp.B ){
                        tr = 0x1;
                    }
                    v = (byte)((byte)(v << 1) | (byte)(tr & 0x1));
                    tcount++;
                    if ( tcount == 8 ) {
                        stream.WriteByte( v );
                        count++;
                        tcount = 0;
                        v = 0x0;
                    }
                }
                if ( 0 < tcount ) {
                    v = (byte)(v << (9 - tcount));
                    stream.WriteByte( v );
                    count++;
                }
                for ( int i = count; i < linesize_mask; i++ ) {
                    stream.WriteByte( 0x0 );
                }
            }
        }
示例#3
0
 public static IconInfoHeader Read( Stream stream ) {
     IconInfoHeader iih = new IconInfoHeader();
     iih.Width = (byte)stream.ReadByte();
     iih.Height = (byte)stream.ReadByte();
     iih.ColorCount = (byte)stream.ReadByte();
     iih.Reserved1 = (byte)stream.ReadByte();
     byte[] buf = new byte[4];
     stream.Read( buf, 0, 4 );
     iih.Reserved2 = BitConverter.ToUInt16( buf, 0 );
     iih.Reserved3 = BitConverter.ToUInt16( buf, 2 );
     stream.Read( buf, 0, 4 );
     iih.icoDIBSize = BitConverter.ToUInt32( buf, 0 );
     stream.Read( buf, 0, 4 );
     iih.icoDIBOffset = BitConverter.ToUInt32( buf, 0 );
     return iih;
 }
示例#4
0
        private static void SaveCor(Bitmap item, Point hotspot, Stream stream, ushort type, Color transp)
        {
            IconFileHeader ifh = new IconFileHeader();

            ifh.icoReserved      = 0x0;
            ifh.icoResourceCount = 1;
            ifh.icoResourceType  = type;
            ifh.Write(stream);
            IconInfoHeader   iif = new IconInfoHeader();
            BITMAPINFOHEADER bih = new BITMAPINFOHEADER();

            iif.Width      = (byte)item.Width;
            iif.Height     = (byte)item.Height;
            iif.ColorCount = 0;
            iif.Reserved1  = 0;
            iif.Reserved2  = (ushort)hotspot.X;
            iif.Reserved3  = (ushort)hotspot.Y;
#if RGB24
            int linesize = ((item.Width * 24 + 31) / 32) * 4;
#else
            int linesize = ((item.Width * 32 + 31) / 32) * 4;
#endif
            int linesize_mask = ((item.Width * 1 + 31) / 32) * 4;
            int size          = linesize * item.Height + linesize_mask * item.Height + 40;
#if DEBUG
            Console.WriteLine("linesize=" + linesize);
#endif
            iif.icoDIBSize   = (uint)size;
            iif.icoDIBOffset = 0x16;
            iif.Write(stream);
            bih.biSize  = 40;
            bih.biWidth = item.Width;
#if RGB24
            bih.biHeight = item.Height * 2;
#else
            bih.biHeight = item.Height * 2;
#endif
            bih.biPlanes = 1;
#if RGB24
            bih.biBitCount = 24;
#else
            bih.biBitCount = 32;
#endif
            bih.biCompression   = 0;
            bih.biSizeImage     = (uint)(linesize * item.Height);
            bih.biXPelsPerMeter = 0; //            (int)(item.HorizontalResolution / 2.54e-2);
            bih.biYPelsPerMeter = 0; //            (int)(item.VerticalResolution / 2.54e-2);
            bih.biClrUsed       = 0;
            bih.biClrImportant  = 0;
            bih.Write(stream);
            for (int y = item.Height - 1; y >= 0; y--)
            {
                int count = 0;
                for (int x = 0; x < item.Width; x++)
                {
                    Color c = item.GetPixel(x, y);
                    stream.WriteByte((byte)c.B);
                    stream.WriteByte((byte)c.G);
                    stream.WriteByte((byte)c.R);
#if DEBUG
                    if (c.R != transp.R || c.G != transp.G || c.B != transp.B)
                    {
                        Console.WriteLine("color=" + c);
                    }
#endif
#if RGB24
                    count += 3;
#else
                    stream.WriteByte((byte)c.A);
                    count += 4;
#endif
                }
                for (int i = count; i < linesize; i++)
                {
                    stream.WriteByte(0x0);
                }
            }

            for (int y = item.Height - 1; y >= 0; y--)
            {
                int  count  = 0;
                byte v      = 0x0;
                int  tcount = 0;
                for (int x = 0; x < item.Width; x++)
                {
                    Color c  = item.GetPixel(x, y);
                    byte  tr = 0x0;
                    if (c.R == transp.R && c.G == transp.G && c.B == transp.B)
                    {
                        tr = 0x1;
                    }
                    v = (byte)((byte)(v << 1) | (byte)(tr & 0x1));
                    tcount++;
                    if (tcount == 8)
                    {
                        stream.WriteByte(v);
                        count++;
                        tcount = 0;
                        v      = 0x0;
                    }
                }
                if (0 < tcount)
                {
                    v = (byte)(v << (9 - tcount));
                    stream.WriteByte(v);
                    count++;
                }
                for (int i = count; i < linesize_mask; i++)
                {
                    stream.WriteByte(0x0);
                }
            }
        }