public override ImageData Read(Stream stream, ImageMetaData info) { var meta = info as GrdMetaData; if (null == meta) throw new ArgumentException ("GrdFormat.Read should be supplied with GrdMetaData", "info"); stream.Position = 12; using (var reader = new Reader (stream, meta.DataSize)) { reader.Unpack(); byte[] pixels = reader.Data; using (var bmp = new MemoryStream (reader.Data, false)) { var decoder = new BmpBitmapDecoder (bmp, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); BitmapSource frame = decoder.Frames[0]; frame.Freeze(); return new ImageData (frame, info); } } }
public override ImageMetaData ReadMetaData(Stream stream) { stream.Seek (4, SeekOrigin.Current); int data_size = stream.ReadByte() | stream.ReadByte() << 8 | stream.ReadByte() << 16 | stream.ReadByte() << 24; stream.Seek (4, SeekOrigin.Current); using (var reader = new Reader (stream, 0x22)) // BMP header { reader.Unpack(); var bmp = reader.Data; if (bmp[0] != 'B' || bmp[1] != 'M') return null; int width = LittleEndian.ToInt32 (bmp, 0x12); int height = LittleEndian.ToInt32 (bmp, 0x16); int bpp = LittleEndian.ToInt16 (bmp, 0x1c); return new GrdMetaData { Width = (uint)width, Height = (uint)height, BPP = bpp, DataSize = data_size, }; } }