private ImageListStreamer(SerializationInfo info, StreamingContext context)
	{
		byte [] data = (byte[])info.GetValue("Data", typeof(byte[]));
		MemoryStream ms = new MemoryStream(data, false); // readonly stream
		foreach(byte b in magicBytes)
		{
			if(ms.ReadByte() != b)
			{
				// Handle I18n
				throw new FormatException("invalid signature"); 
			}
		}
		Stream encodedStream = new RunLengthEncodedStream(ms);
		BinaryReader reader = new BinaryReader(encodedStream);
		try
		{
			ushort magic 	 = reader.ReadUInt16();
			ushort version 	 = reader.ReadUInt16();
			ushort currImage = reader.ReadUInt16();
			ushort maxImage	 = reader.ReadUInt16();
			ushort grow 	 = reader.ReadUInt16();
			ushort width	 = reader.ReadUInt16();
			ushort height	 = reader.ReadUInt16();
			uint bkcolor	 = reader.ReadUInt32();
			ushort flags	 = reader.ReadUInt16();
			short []overlays = new short [4];
			for(int i = 0; i < 4 ; i++)
			{
				overlays[i]  = reader.ReadInt16();
			}
			Image imagelist = Image.FromStream(reader.BaseStream); 
			if(imagelist is Bitmap)
			{
				int rowStep = imagelist.Width / width;
				images = new Image[currImage];
				for(int i = 0 ; i < currImage ; i++)
				{
					Rectangle imageArea = new Rectangle(
											(i % rowStep) / width,
											(i/rowStep) * height, 
											width,
											height);
					PixelFormat format = imagelist.PixelFormat;
					if((imagelist.PixelFormat & PixelFormat.Indexed) != 0)
					{
						// ImageCollection will reformat back to Indexed
						// if needed
						format = PixelFormat.Format24bppRgb;
					}
					images[i] = (imagelist as Bitmap).Clone(imageArea, 
															format);
				}
			}
			else
			{
				images = null;
			}
		}
		finally
		{
			reader.Close();
			encodedStream.Close();
			ms.Close();
		}
	}
Esempio n. 2
0
        private ImageListStreamer(SerializationInfo info, StreamingContext context)
        {
            byte []      data = (byte[])info.GetValue("Data", typeof(byte[]));
            MemoryStream ms   = new MemoryStream(data, false);   // readonly stream

            foreach (byte b in magicBytes)
            {
                if (ms.ReadByte() != b)
                {
                    // Handle I18n
                    throw new FormatException("invalid signature");
                }
            }
            Stream       encodedStream = new RunLengthEncodedStream(ms);
            BinaryReader reader        = new BinaryReader(encodedStream);

            try
            {
                ushort   magic     = reader.ReadUInt16();
                ushort   version   = reader.ReadUInt16();
                ushort   currImage = reader.ReadUInt16();
                ushort   maxImage  = reader.ReadUInt16();
                ushort   grow      = reader.ReadUInt16();
                ushort   width     = reader.ReadUInt16();
                ushort   height    = reader.ReadUInt16();
                uint     bkcolor   = reader.ReadUInt32();
                ushort   flags     = reader.ReadUInt16();
                short [] overlays  = new short [4];
                for (int i = 0; i < 4; i++)
                {
                    overlays[i] = reader.ReadInt16();
                }
                Image imagelist = Image.FromStream(reader.BaseStream);
                if (imagelist is Bitmap)
                {
                    int rowStep = imagelist.Width / width;
                    images = new Image[currImage];
                    for (int i = 0; i < currImage; i++)
                    {
                        Rectangle imageArea = new Rectangle(
                            (i % rowStep) / width,
                            (i / rowStep) * height,
                            width,
                            height);
                        PixelFormat format = imagelist.PixelFormat;
                        if ((imagelist.PixelFormat & PixelFormat.Indexed) != 0)
                        {
                            // ImageCollection will reformat back to Indexed
                            // if needed
                            format = PixelFormat.Format24bppRgb;
                        }
                        images[i] = (imagelist as Bitmap).Clone(imageArea,
                                                                format);
                    }
                }
                else
                {
                    images = null;
                }
            }
            finally
            {
                reader.Close();
                encodedStream.Close();
                ms.Close();
            }
        }