public override ImageMetaData ReadMetaData(IBinaryStream file) { var header = file.ReadHeader(0x40); if (!header.AsciiEqual(4, "00\0\0")) { return(null); } var ykg = new YkgMetaData { DataOffset = header.ToUInt32(0x28), DataSize = header.ToUInt32(0x2C) }; if (0 == ykg.DataOffset) { ykg.DataOffset = header.ToUInt32(8); } if (ykg.DataOffset < 0x30) { return(null); } if (0 == ykg.DataSize) { ykg.DataSize = (uint)(file.Length - ykg.DataOffset); } ImageMetaData info = null; using (var reg = new StreamRegion(file.AsStream, ykg.DataOffset, ykg.DataSize, true)) using (var img = new BinaryStream(reg, file.Name)) { var img_header = img.ReadHeader(4); if (header.AsciiEqual("BM")) { img.Position = 0; info = Bmp.ReadMetaData(img); ykg.Format = YkgImage.Bmp; } else if (header.AsciiEqual("\x89PNG")) { img.Position = 0; info = Png.ReadMetaData(img); ykg.Format = YkgImage.Png; } else if (header.AsciiEqual("\x89GNP")) { using (var body = new StreamRegion(file.AsStream, ykg.DataOffset + 4, ykg.DataSize - 4, true)) using (var pre = new PrefixStream(PngPrefix, body)) using (var png = new BinaryStream(pre, file.Name)) info = Png.ReadMetaData(png); ykg.Format = YkgImage.Gnp; } } if (null == info) { return(null); } ykg.Width = info.Width; ykg.Height = info.Height; ykg.BPP = info.BPP; ykg.OffsetX = info.OffsetX; ykg.OffsetY = info.OffsetY; return(ykg); }
public override ImageMetaData ReadMetaData(Stream stream) { var header = new byte[0x40]; if (header.Length != stream.Read(header, 0, header.Length)) { return(null); } if (!Binary.AsciiEqual(header, 4, "00\0\0")) { return(null); } var ykg = new YkgMetaData { DataOffset = LittleEndian.ToUInt32(header, 0x28), DataSize = LittleEndian.ToUInt32(header, 0x2C) }; if (0 == ykg.DataOffset) { ykg.DataOffset = LittleEndian.ToUInt32(header, 8); } if (ykg.DataOffset < 0x30) { return(null); } if (0 == ykg.DataSize) { ykg.DataSize = (uint)(stream.Length - ykg.DataOffset); } ImageMetaData info = null; using (var img = new StreamRegion(stream, ykg.DataOffset, ykg.DataSize, true)) { if (4 != img.Read(header, 0, 4)) { return(null); } if (Binary.AsciiEqual(header, "BM")) { img.Position = 0; info = ImageFormat.Bmp.ReadMetaData(img); ykg.Format = YkgImage.Bmp; } else if (Binary.AsciiEqual(header, "\x89PNG")) { img.Position = 0; info = Png.ReadMetaData(img); ykg.Format = YkgImage.Png; } else if (Binary.AsciiEqual(header, "\x89GNP")) { using (var body = new StreamRegion(stream, ykg.DataOffset + 4, ykg.DataSize - 4, true)) using (var png = new PrefixStream(PngPrefix, body)) info = Png.ReadMetaData(png); ykg.Format = YkgImage.Gnp; } } if (null == info) { return(null); } ykg.Width = info.Width; ykg.Height = info.Height; ykg.BPP = info.BPP; ykg.OffsetX = info.OffsetX; ykg.OffsetY = info.OffsetY; return(ykg); }
public override ImageMetaData ReadMetaData(Stream stream) { var header = new byte[0x40]; if (header.Length != stream.Read (header, 0, header.Length)) return null; if (!Binary.AsciiEqual (header, 4, "00\0\0")) return null; var ykg = new YkgMetaData { DataOffset = LittleEndian.ToUInt32 (header, 0x28), DataSize = LittleEndian.ToUInt32 (header, 0x2C) }; if (0 == ykg.DataOffset) ykg.DataOffset = LittleEndian.ToUInt32 (header, 8); if (ykg.DataOffset < 0x30) return null; if (0 == ykg.DataSize) ykg.DataSize = (uint)(stream.Length - ykg.DataOffset); ImageMetaData info = null; using (var img = new StreamRegion (stream, ykg.DataOffset, ykg.DataSize, true)) { if (4 != img.Read (header, 0, 4)) return null; if (Binary.AsciiEqual (header, "BM")) { img.Position = 0; info = ImageFormat.Bmp.ReadMetaData (img); ykg.Format = YkgImage.Bmp; } else if (Binary.AsciiEqual (header, "\x89PNG")) { img.Position = 0; info = Png.ReadMetaData (img); ykg.Format = YkgImage.Png; } else if (Binary.AsciiEqual (header, "\x89GNP")) { using (var body = new StreamRegion (stream, ykg.DataOffset+4, ykg.DataSize-4, true)) using (var png = new PrefixStream (PngPrefix, body)) info = Png.ReadMetaData (png); ykg.Format = YkgImage.Gnp; } } if (null == info) return null; ykg.Width = info.Width; ykg.Height = info.Height; ykg.BPP = info.BPP; ykg.OffsetX = info.OffsetX; ykg.OffsetY = info.OffsetY; return ykg; }