/*! * \brief pixReadMemJpeg() * * \param[in] data const; jpeg-encoded * \param[in] size of data * \param[in] cmflag colormap flag 0 means return RGB image if color; * 1 means create a colormap and return * an 8 bpp colormapped image if color * \param[in] reduction scaling factor: 1, 2, 4 or 8 * \param[out] pnwarn [optional] number of warnings * \param[in] hint a bitwise OR of L_JPEG_* values; 0 for default * \return pix, or NULL on error * * <pre> * Notes: * (1) The %size byte of %data must be a null character. * (2) The only hint flag so far is L_JPEG_READ_LUMINANCE, * given in the enum in imageio.h. * (3) See pixReadJpeg() for usage. * </pre> */ PIX * pixReadMemJpeg(const l_uint8 *data, size_t size, l_int32 cmflag, l_int32 reduction, l_int32 *pnwarn, l_int32 hint) { l_int32 ret; l_uint8 *comment; FILE *fp; PIX *pix; PROCNAME("pixReadMemJpeg"); if (pnwarn) *pnwarn = 0; if (!data) return (PIX *)ERROR_PTR("data not defined", procName, NULL); if ((fp = fopenReadFromMemory(data, size)) == NULL) return (PIX *)ERROR_PTR("stream not opened", procName, NULL); pix = pixReadStreamJpeg(fp, cmflag, reduction, pnwarn, hint); if (pix) { ret = fgetJpegComment(fp, &comment); if (!ret && comment) { pixSetText(pix, (char *)comment); LEPT_FREE(comment); } } fclose(fp); if (!pix) L_ERROR("pix not read\n", procName); return pix; }
/*! * pixReadJpeg() * * Input: filename * colormap flag (0 means return RGB image if color; * 1 means create colormap and return 8 bpp * palette image if color) * reduction (scaling factor: 1, 2, 4 or 8) * &pnwarn (<optional return> number of warnings about * corrupted data) * Return: pix, or null on error * * Images reduced by factors of 2, 4 or 8 can be returned * significantly faster than full resolution images. * * The jpeg library will return warnings (or exit) if * the jpeg data is bad. Use this function if you want the * jpeg library to create an 8 bpp palette image, or to * tell if the jpeg data has been corrupted. For corrupt jpeg * data, there are two possible outcomes: * (1) a damaged pix will be returned, along with a nonzero * number of warnings, or * (2) for sufficiently serious problems, the library will attempt * to exit (caught by our error handler) and no pix will be returned. */ PIX * pixReadJpeg(const char *filename, l_int32 cmflag, l_int32 reduction, l_int32 *pnwarn) { FILE *fp; PIX *pix; PROCNAME("pixReadJpeg"); if (!filename) return (PIX *)ERROR_PTR("filename not defined", procName, NULL); if (pnwarn) *pnwarn = 0; /* init */ if (cmflag != 0 && cmflag != 1) cmflag = 0; /* default */ if (reduction != 1 && reduction != 2 && reduction != 4 && reduction != 8) return (PIX *)ERROR_PTR("reduction not in {1,2,4,8}", procName, NULL); if ((fp = fopenReadStream(filename)) == NULL) return (PIX *)ERROR_PTR("image file not found", procName, NULL); pix = pixReadStreamJpeg(fp, cmflag, reduction, pnwarn, 0); fclose(fp); if (!pix) return (PIX *)ERROR_PTR("image not returned", procName, NULL); return pix; }
/*! * pixReadMemJpeg() * * Input: data (const; jpeg-encoded) * size (of data) * colormap flag (0 means return RGB image if color; * 1 means create a colormap and return * an 8 bpp colormapped image if color) * reduction (scaling factor: 1, 2, 4 or 8) * &nwarn (<optional return> number of warnings) * hint (a bitwise OR of L_JPEG_* values; 0 for default) * Return: pix, or null on error * * Notes: * (1) The @size byte of @data must be a null character. * (2) The only hint flag so far is L_JPEG_READ_LUMINANCE, * given in the enum in imageio.h. * (3) See pixReadJpeg() for usage. */ PIX * pixReadMemJpeg(const l_uint8 *data, size_t size, l_int32 cmflag, l_int32 reduction, l_int32 *pnwarn, l_int32 hint) { l_int32 ret; l_uint8 *comment; FILE *fp; PIX *pix; PROCNAME("pixReadMemJpeg"); if (pnwarn) *pnwarn = 0; if (!data) return (PIX *)ERROR_PTR("data not defined", procName, NULL); #if HAVE_FMEMOPEN if ((fp = fmemopen((l_uint8 *)data, size, "r")) == NULL) return (PIX *)ERROR_PTR("stream not opened", procName, NULL); #else L_WARNING("work-around: writing to a temp file\n", procName); if ((fp = tmpfile()) == NULL) return (PIX *)ERROR_PTR("tmpfile stream not opened", procName, NULL); fwrite(data, 1, size, fp); rewind(fp); #endif /* HAVE_FMEMOPEN */ pix = pixReadStreamJpeg(fp, cmflag, reduction, pnwarn, hint); if (pix) { ret = fgetJpegComment(fp, &comment); if (!ret && comment) { pixSetText(pix, (char *)comment); FREE(comment); } } fclose(fp); if (!pix) L_ERROR("pix not read\n", procName); return pix; }
/*! * \brief pixReadJpeg() * * \param[in] filename * \param[in] cmapflag 0 for no colormap in returned pix; * 1 to return an 8 bpp cmapped pix if spp = 3 or 4 * \param[in] reduction scaling factor: 1, 2, 4 or 8 * \param[out] pnwarn [optional] number of warnings about * corrupted data * \param[in] hint a bitwise OR of L_JPEG_* values; 0 for default * \return pix, or NULL on error * * <pre> * Notes: * (1) This is a special function for reading jpeg files. * (2) Use this if you want the jpeg library to create * an 8 bpp colormapped image. * (3) Images reduced by factors of 2, 4 or 8 can be returned * significantly faster than full resolution images. * (4) If the jpeg data is bad, the jpeg library will continue * silently, or return warnings, or attempt to exit. Depending * on the severity of the data corruption, there are two possible * outcomes: * (a) a possibly damaged pix can be generated, along with zero * or more warnings, or * (b) the library will attempt to exit (caught by our error * handler) and no pix will be returned. * If a pix is generated with at least one warning of data * corruption, and if L_JPEG_FAIL_ON_BAD_DATA is included in %hint, * no pix will be returned. * (5) The possible hint values are given in the enum in imageio.h: * * L_JPEG_READ_LUMINANCE * * L_JPEG_FAIL_ON_BAD_DATA * Default (0) is to do neither. * </pre> */ PIX * pixReadJpeg(const char *filename, l_int32 cmapflag, l_int32 reduction, l_int32 *pnwarn, l_int32 hint) { l_int32 ret; l_uint8 *comment; FILE *fp; PIX *pix; PROCNAME("pixReadJpeg"); if (pnwarn) *pnwarn = 0; if (!filename) return (PIX *)ERROR_PTR("filename not defined", procName, NULL); if (cmapflag != 0 && cmapflag != 1) cmapflag = 0; /* default */ if (reduction != 1 && reduction != 2 && reduction != 4 && reduction != 8) return (PIX *)ERROR_PTR("reduction not in {1,2,4,8}", procName, NULL); if ((fp = fopenReadStream(filename)) == NULL) return (PIX *)ERROR_PTR("image file not found", procName, NULL); pix = pixReadStreamJpeg(fp, cmapflag, reduction, pnwarn, hint); if (pix) { ret = fgetJpegComment(fp, &comment); if (!ret && comment) pixSetText(pix, (char *)comment); LEPT_FREE(comment); } fclose(fp); if (!pix) return (PIX *)ERROR_PTR("image not returned", procName, NULL); return pix; }
/*! * pixReadMemJpeg() * * Input: cdata (const; jpeg-encoded) * size (of data) * colormap flag (0 means return RGB image if color; * 1 means create colormap and return 8 bpp * palette image if color) * reduction (scaling factor: 1, 2, 4 or 8) * &pnwarn (<optional return> number of warnings) * hint (bitwise OR of L_HINT_* values; use 0 for no hint) * Return: pix, or null on error * * Notes: * (1) The @size byte of @data must be a null character. * (2) See pixReadJpeg() for usage. */ PIX * pixReadMemJpeg(const l_uint8 *cdata, size_t size, l_int32 cmflag, l_int32 reduction, l_int32 *pnwarn, l_int32 hint) { l_uint8 *data; FILE *fp; PIX *pix; PROCNAME("pixReadMemJpeg"); if (!cdata) return (PIX *)ERROR_PTR("cdata not defined", procName, NULL); data = (l_uint8 *)cdata; /* we're really not going to change this */ if ((fp = fmemopen(data, size, "r")) == NULL) return (PIX *)ERROR_PTR("stream not opened", procName, NULL); pix = pixReadStreamJpeg(fp, cmflag, reduction, pnwarn, hint); fclose(fp); return pix; }
/*! * pixReadStream() * * Input: fp (file stream) * hint (bitwise OR of L_HINT_* values for jpeg; use 0 for no hint) * Return: pix if OK; null on error * * Notes: * (1) The hint only applies to jpeg. */ PIX * pixReadStream(FILE *fp, l_int32 hint) { l_int32 format, ret; l_uint8 *comment; PIX *pix; PROCNAME("pixReadStream"); if (!fp) return (PIX *)ERROR_PTR("stream not defined", procName, NULL); pix = NULL; findFileFormatStream(fp, &format); switch (format) { case IFF_BMP: if ((pix = pixReadStreamBmp(fp)) == NULL ) return (PIX *)ERROR_PTR( "bmp: no pix returned", procName, NULL); break; case IFF_JFIF_JPEG: if ((pix = pixReadStreamJpeg(fp, 0, 1, NULL, hint)) == NULL) return (PIX *)ERROR_PTR( "jpeg: no pix returned", procName, NULL); ret = fgetJpegComment(fp, &comment); if (!ret && comment) pixSetText(pix, (char *)comment); FREE(comment); break; case IFF_PNG: if ((pix = pixReadStreamPng(fp)) == NULL) return (PIX *)ERROR_PTR("png: no pix returned", procName, NULL); 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: if ((pix = pixReadStreamTiff(fp, 0)) == NULL) /* page 0 by default */ return (PIX *)ERROR_PTR("tiff: no pix returned", procName, NULL); break; case IFF_PNM: if ((pix = pixReadStreamPnm(fp)) == NULL) return (PIX *)ERROR_PTR("pnm: no pix returned", procName, NULL); break; case IFF_GIF: if ((pix = pixReadStreamGif(fp)) == NULL) return (PIX *)ERROR_PTR("gif: no pix returned", procName, NULL); break; case IFF_JP2: if ((pix = pixReadStreamJp2k(fp, 1, NULL, 0, 0)) == NULL) return (PIX *)ERROR_PTR("jp2: no pix returned", procName, NULL); break; case IFF_WEBP: if ((pix = pixReadStreamWebP(fp)) == NULL) return (PIX *)ERROR_PTR("webp: no pix returned", procName, NULL); break; case IFF_SPIX: if ((pix = pixReadStreamSpix(fp)) == NULL) return (PIX *)ERROR_PTR("spix: no pix returned", procName, NULL); break; case IFF_UNKNOWN: return (PIX *)ERROR_PTR( "Unknown format: no pix returned", procName, NULL); break; } if (pix) pixSetInputFormat(pix, format); return pix; }