Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }