/// <param name="stream"> /// Stream containing ILBM image data. /// </param> public ILBMImage(Stream stream) { //BinaryReader reader = new BinaryReader(stream, Encoding.ASCII); //ReadNext(reader); IFFReader reader = new IFFReader(stream); var file = reader.ReadFileHeader(); if(file.FormatID != "PBM ") { throw new NotSupportedException("This is not supported IBLM file."); } foreach(IFFChunk chunk in reader.ReadAll()) { switch(chunk.TypeID) { case "BMHD": Width = reader.ReadInt16(); Height = reader.ReadInt16(); PosX = reader.ReadInt16(); PosY = reader.ReadInt16(); NumPlanes = reader.ReadByte(); Mask = reader.ReadByte(); Compression = reader.ReadByte(); Padding = reader.ReadByte(); Transparent = reader.ReadInt16(); AspectRatio = reader.ReadInt16(); PageWidth = reader.ReadInt16(); PageHeight = reader.ReadInt16(); break; case "CMAP": Color[] pal = new Color[chunk.Length/3]; for(int i = 0; i < pal.Length; i++) { byte R = reader.ReadByte(); byte G = reader.ReadByte(); byte B = reader.ReadByte(); pal[i] = Color.FromArgb(R, G, B); } Palette = ImagePalette.Create(pal); break; case "GRAB": HotspotX = reader.ReadInt16(); HotspotY = reader.ReadInt16(); break; case "CRNG": if(ColorRanges == null)ColorRanges = new List<ColorRange>(); ColorRanges.Add(new ColorRange(reader)); break; case "TINY": short width = reader.ReadInt16(); short height = reader.ReadInt16(); byte[] tiny; if(Compression == 1) { tiny = reader.ReadUnpack(chunk.Length-4); }else{ tiny = reader.ReadBytes(chunk.Length-4); } Tiny = new TinyImage(width, height, tiny); break; case "BODY": if(Compression == 1) { ImageData = reader.ReadUnpack(chunk.Length); }else{ ImageData = reader.ReadBytes(chunk.Length); } break; } } }