private static Size DecodeWebP(BinaryReader binaryReader) { // 'RIFF' already read binaryReader.ReadBytes(4); if (ByteHelper.ReadInt32LE(binaryReader) != 1346520407)// 1346520407 : 'WEBP' { return(Size.Empty); } switch (ByteHelper.ReadInt32LE(binaryReader)) { case 540561494: // 'VP8 ' : lossy // skip stuff we don't need binaryReader.ReadBytes(7); if (ByteHelper.ReadInt24LE(binaryReader) != 2752925) // invalid webp file { return(Size.Empty); } return(new Size(ByteHelper.ReadInt16LE(binaryReader), ByteHelper.ReadInt16LE(binaryReader))); case 1278758998: // 'VP8L' : lossless // skip stuff we don't need binaryReader.ReadBytes(4); if (binaryReader.ReadByte() != 47) // 0x2f : 47 1 byte signature { return(Size.Empty); } byte[] b = binaryReader.ReadBytes(4); return(new Size( 1 + (((b[1] & 0x3F) << 8) | b[0]), 1 + ((b[3] << 10) | (b[2] << 2) | ((b[1] & 0xC0) >> 6)))); // if something breaks put in the '& 0xF' but & oxf should do nothing in theory // because inclusive & with 1111 will leave the binary untouched // 1 + (((wh[3] & 0xF) << 10) | (wh[2] << 2) | ((wh[1] & 0xC0) >> 6)) case 1480085590: // 'VP8X' : extended // skip stuff we don't need binaryReader.ReadBytes(8); return(new Size(1 + ByteHelper.ReadInt24LE(binaryReader), 1 + ByteHelper.ReadInt24LE(binaryReader))); } return(Size.Empty); }
private static Size DecodeTiffLE(BinaryReader binaryReader) { if (binaryReader.ReadByte() != 0) { return(Size.Empty); } int idfStart = ByteHelper.ReadInt32LE(binaryReader); binaryReader.BaseStream.Seek(idfStart, SeekOrigin.Begin); int numberOfIDF = ByteHelper.ReadInt16LE(binaryReader); int width = -1; int height = -1; for (int i = 0; i < numberOfIDF; i++) { short field = ByteHelper.ReadInt16LE(binaryReader); switch (field) { // https://www.awaresystems.be/imaging/tiff/tifftags/baseline.html default: binaryReader.ReadBytes(10); break; case 256: // image width binaryReader.ReadBytes(6); width = ByteHelper.ReadInt32LE(binaryReader); break; case 257: // image length binaryReader.ReadBytes(6); height = ByteHelper.ReadInt32LE(binaryReader); break; } if (width != -1 && height != -1) { return(new Size(width, height)); } } return(Size.Empty); }