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(); } }
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(); } }