/*! * readHeaderWebP() * * Input: filename * &w (<return> width) * &h (<return> height) * &spp (<return> spp (3 or 4)) * Return: 0 if OK, 1 on error */ l_int32 readHeaderWebP(const char *filename, l_int32 *pw, l_int32 *ph, l_int32 *pspp) { l_uint8 data[100]; /* expect size info within the first 50 bytes or so */ l_int32 nbytes, bytesread; size_t filesize; FILE *fp; PROCNAME("readHeaderWebP"); if (!pw || !ph || !pspp) return ERROR_INT("input ptr(s) not defined", procName, 1); *pw = *ph = *pspp = 0; if (!filename) return ERROR_INT("filename not defined", procName, 1); /* Read no more than 100 bytes from the file */ if ((filesize = nbytesInFile(filename)) == 0) return ERROR_INT("no file size found", procName, 1); if (filesize < 100) L_WARNING("very small webp file\n", procName); nbytes = L_MIN(filesize, 100); if ((fp = fopenReadStream(filename)) == NULL) return ERROR_INT("image file not found", procName, 1); bytesread = fread((char *)data, 1, nbytes, fp); fclose(fp); if (bytesread != nbytes) return ERROR_INT("failed to read requested data", procName, 1); return readHeaderMemWebP(data, nbytes, pw, ph, pspp); }
/*! * pixReadHeaderMem() * * Input: data (const; encoded) * datasize (size of data) * &format (<optional returns> image format) * &w, &h (<optional returns> width and height) * &bps <optional return> bits/sample * &spp <optional return> samples/pixel (1, 3 or 4) * &iscmap (<optional return> 1 if cmap exists; 0 otherwise) * Return: 0 if OK, 1 on error * * Notes: * (1) This reads the actual headers for jpeg, png, tiff, jp2k and pnm. * For bmp and gif, we cheat and read all the data into a pix, * from which we extract the "header" information. * (2) The amount of data required depends on the format. For * png, it requires less than 30 bytes, but for jpeg it can * require most of the compressed file. In practice, the data * is typically the entire compressed file in memory. * (3) findFileFormatBuffer() requires up to 8 bytes to decide on * the format, which we require. */ l_int32 pixReadHeaderMem(const l_uint8 *data, size_t size, l_int32 *pformat, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap) { l_int32 format, ret, w, h, d, bps, spp, iscmap; l_int32 type; /* not used */ PIX *pix; PROCNAME("pixReadHeaderMem"); if (pw) *pw = 0; if (ph) *ph = 0; if (pbps) *pbps = 0; if (pspp) *pspp = 0; if (piscmap) *piscmap = 0; if (pformat) *pformat = 0; iscmap = 0; /* init to false */ if (!data) return ERROR_INT("data not defined", procName, 1); if (size < 8) return ERROR_INT("size < 8", procName, 1); findFileFormatBuffer(data, &format); switch (format) { case IFF_BMP: /* cheating: read the pix */ if ((pix = pixReadMemBmp(data, size)) == NULL) return ERROR_INT( "bmp: pix not read", procName, 1); pixGetDimensions(pix, &w, &h, &d); pixDestroy(&pix); bps = (d == 32) ? 8 : d; spp = (d == 32) ? 3 : 1; break; case IFF_JFIF_JPEG: ret = readHeaderMemJpeg(data, size, &w, &h, &spp, NULL, NULL); bps = 8; if (ret) return ERROR_INT( "jpeg: no header info returned", procName, 1); break; case IFF_PNG: ret = readHeaderMemPng(data, size, &w, &h, &bps, &spp, &iscmap); if (ret) return ERROR_INT( "png: no header info returned", procName, 1); break; case IFF_TIFF: case IFF_TIFF_PACKBITS: case IFF_TIFF_RLE: case IFF_TIFF_G3: case IFF_TIFF_G4: case IFF_TIFF_LZW: case IFF_TIFF_ZIP: /* Reading page 0 by default; possibly redefine format */ ret = readHeaderMemTiff(data, size, 0, &w, &h, &bps, &spp, NULL, &iscmap, &format); if (ret) return ERROR_INT( "tiff: no header info returned", procName, 1); break; case IFF_PNM: ret = readHeaderMemPnm(data, size, &w, &h, &d, &type, &bps, &spp); if (ret) return ERROR_INT( "pnm: no header info returned", procName, 1); break; case IFF_GIF: /* cheating: read the pix */ if ((pix = pixReadMemGif(data, size)) == NULL) return ERROR_INT( "gif: pix not read", procName, 1); pixGetDimensions(pix, &w, &h, &d); pixDestroy(&pix); iscmap = 1; /* always colormapped; max 256 colors */ spp = 1; bps = d; break; case IFF_JP2: ret = readHeaderMemJp2k(data, size, &w, &h, &bps, &spp); break; case IFF_WEBP: bps = 8; ret = readHeaderMemWebP(data, size, &w, &h, &spp); break; case IFF_SPIX: ret = sreadHeaderSpix((l_uint32 *)data, &w, &h, &bps, &spp, &iscmap); if (ret) return ERROR_INT( "pnm: no header info returned", procName, 1); break; case IFF_UNKNOWN: return ERROR_INT("unknown format; no data returned", procName, 1); break; } if (pw) *pw = w; if (ph) *ph = h; if (pbps) *pbps = bps; if (pspp) *pspp = spp; if (piscmap) *piscmap = iscmap; if (pformat) *pformat = format; return 0; }