本文整理汇总了C++中png_set_gray_1_2_4_to_8函数的典型用法代码示例。如果您正苦于以下问题:C++ png_set_gray_1_2_4_to_8函数的具体用法?C++ png_set_gray_1_2_4_to_8怎么用?C++ png_set_gray_1_2_4_to_8使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了png_set_gray_1_2_4_to_8函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: png_set_palette_to_rgb
// Do transformations to normalize the input to 8-bpp RGBA
void LLPngWrapper::normalizeImage()
{
// 1. Expand any palettes
// 2. Convert grayscales to RGB
// 3. Create alpha layer from transparency
// 4. Ensure 8-bpp for all images
// 5. Apply background matte if any
// 6. Set (or guess) gamma
if (mColorType == PNG_COLOR_TYPE_PALETTE)
{
png_set_palette_to_rgb(mReadPngPtr);
}
if (mColorType == PNG_COLOR_TYPE_GRAY && mBitDepth < 8)
{
png_set_gray_1_2_4_to_8(mReadPngPtr);
}
if (mColorType == PNG_COLOR_TYPE_GRAY
|| mColorType == PNG_COLOR_TYPE_GRAY_ALPHA)
{
png_set_gray_to_rgb(mReadPngPtr);
}
if (png_get_valid(mReadPngPtr, mReadInfoPtr, PNG_INFO_tRNS))
{
png_set_tRNS_to_alpha(mReadPngPtr);
}
if (mBitDepth < 8)
{
png_set_packing(mReadPngPtr);
}
else if (mBitDepth == 16)
{
png_set_strip_16(mReadPngPtr);
}
mHasBKGD = png_get_bKGD(mReadPngPtr, mReadInfoPtr, &mBackgroundColor);
if (mHasBKGD)
{
png_set_background(mReadPngPtr, mBackgroundColor,
PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
}
#if LL_DARWIN
const F64 SCREEN_GAMMA = 1.8;
#else
const F64 SCREEN_GAMMA = 2.2;
#endif
if (png_get_gAMA(mReadPngPtr, mReadInfoPtr, &mGamma))
{
png_set_gamma(mReadPngPtr, SCREEN_GAMMA, mGamma);
}
else
{
png_set_gamma(mReadPngPtr, SCREEN_GAMMA, 1/SCREEN_GAMMA);
}
}
示例2: DEBUG_ENTER_FUNC
//
// Load a texture from a png image
//
bool PngLoader::loadImageIntoBuffer() {
DEBUG_ENTER_FUNC();
if (!basicImageLoad()) {
png_destroy_read_struct(&_pngPtr, &_infoPtr, png_infopp_NULL);
return false;
}
png_set_strip_16(_pngPtr); // Strip off 16 bit channels in case they occur
if (_paletteSize) {
// Copy the palette
png_colorp srcPal = _infoPtr->palette;
for (int i = 0; i < _infoPtr->num_palette; i++) {
unsigned char alphaVal = (i < _infoPtr->num_trans) ? _infoPtr->trans[i] : 0xFF; // Load alpha if it's there
_palette->setSingleColorRGBA(i, srcPal->red, srcPal->green, srcPal->blue, alphaVal);
srcPal++;
}
} else { // Not a palettized image
if (_colorType == PNG_COLOR_TYPE_GRAY && _bitDepth < 8)
png_set_gray_1_2_4_to_8(_pngPtr); // Round up grayscale images
if (png_get_valid(_pngPtr, _infoPtr, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(_pngPtr); // Convert trans channel to alpha for 32 bits
png_set_add_alpha(_pngPtr, 0xff, PNG_FILLER_AFTER); // Filler for alpha if none exists
}
uint32 rowBytes = png_get_rowbytes(_pngPtr, _infoPtr);
// there seems to be a bug in libpng where it doesn't increase the rowbytes or the
// channel even after we add the alpha channel
if (_channels == 3 && (rowBytes / _width) == 3) {
_channels = 4;
rowBytes = _width * _channels;
}
PSP_DEBUG_PRINT("rowBytes[%d], channels[%d]\n", rowBytes, _channels);
unsigned char *line = (unsigned char*) malloc(rowBytes);
if (!line) {
png_destroy_read_struct(&_pngPtr, png_infopp_NULL, png_infopp_NULL);
PSP_ERROR("Couldn't allocate line\n");
return false;
}
for (size_t y = 0; y < _height; y++) {
png_read_row(_pngPtr, line, png_bytep_NULL);
_buffer->copyFromRect(line, rowBytes, 0, y, _width, 1); // Copy into buffer
}
free(line);
png_read_end(_pngPtr, _infoPtr);
png_destroy_read_struct(&_pngPtr, &_infoPtr, png_infopp_NULL);
return true;
}
示例3: load_png
//=============================================================================
// load_png
//=============================================================================
int load_png(PKLImage pkl, FILE *image)
{
png_structp png_ptr;
png_infop info_ptr;
int i;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(!png_ptr) return(1);
info_ptr = png_create_info_struct(png_ptr);
if(!info_ptr){
png_destroy_read_struct(&png_ptr, NULL, NULL);
return(1);
}
if( setjmp(png_jmpbuf(png_ptr)) ){
png_destroy_info_struct(png_ptr, &info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
return(1);
}
png_init_io(png_ptr, image);
png_read_info(png_ptr, info_ptr);
pkl->width = info_ptr->width;
pkl->height = info_ptr->height;
pkl->color = color_pn2pk(info_ptr->color_type);
pkl->channel = pkl_png_channels(pkl->color);
pkl->resh = resolution_p2p(info_ptr->phys_unit_type, info_ptr->x_pixels_per_unit);
pkl->resv = resolution_p2p(info_ptr->phys_unit_type, info_ptr->y_pixels_per_unit);
if(pkl->color == PKL_UNKNOWN) return(1);
pkl->image = malloc(pkl->width * pkl->height * pkl->channel);
if(!pkl->image) return(1);
if(info_ptr->color_type==PNG_COLOR_TYPE_RGB_ALPHA ||
info_ptr->color_type==PNG_COLOR_TYPE_GRAY_ALPHA || info_ptr->num_trans) png_set_strip_alpha(png_ptr);
if(info_ptr->bit_depth<8 &&
info_ptr->color_type==PNG_COLOR_TYPE_GRAY) png_set_gray_1_2_4_to_8(png_ptr);
if(info_ptr->bit_depth==16) png_set_strip_16(png_ptr);
if(info_ptr->color_type==PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
for(i=0; i<pkl->height; i++)
png_read_row(png_ptr, &pkl->image[i*pkl->width*pkl->channel], NULL);
png_destroy_info_struct(png_ptr, &info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
return(0);
}
示例4: _gTexLoadPNG
void _gTexLoadPNG(FILE* fp, gImage* tex)
{
png_structp png_ptr;
png_infop info_ptr;
unsigned int sig_read = 0;
png_uint_32 width, height;
int bit_depth, color_type, interlace_type, x, y;
u32* line;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
png_set_error_fn(png_ptr,NULL,NULL,NULL);
info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr,fp);
png_set_sig_bytes(png_ptr,sig_read);
png_read_info(png_ptr,info_ptr);
png_get_IHDR(png_ptr,info_ptr,&width,&height,&bit_depth,&color_type,
&interlace_type,NULL,NULL);
png_set_strip_16(png_ptr);
png_set_packing(png_ptr);
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_gray_1_2_4_to_8(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(png_ptr);
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
tex->w = width;
tex->h = height;
tex->tw = _getNextPower2(width);
tex->th = _getNextPower2(height);
tex->ratio = (float)width / height;
tex->data = memalign(16, tex->tw * tex->th * sizeof(gColor));
line = malloc(width * 4);
for (y = 0; y < height; y++) {
png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
for (x = 0; x < width; x++) {
u32 color = line[x];
tex->data[x + y * tex->tw] = color;
}
}
free(line);
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
}
示例5: read_png
gboolean read_png(curlMemoryStructGCS *chunk, unsigned char **raw_image, picSrcImageInfoGCS *info, char *errBuf)
{
png_structp png_ptr;
png_infop info_ptr;
/* initialize stuff */
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
GST_DEBUG("png_create_read_struct failed");
strcpy(errBuf, "read_png - Error : png_create_read_struct failed");
return FALSE;
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
GST_DEBUG("png_create_info_struct failed");
strcpy(errBuf, "read_png - Error : png_create_info_struct failed");
return FALSE;
}
FILE* memstream = fmemopen((void *)chunk->memory, chunk->size, "rb");
if (!memstream) {
GST_DEBUG("fmemopen failed");
strcpy(errBuf, "read_imgheader - Error : fmemopen failed");
return FALSE;
}
png_init_io(png_ptr, memstream);
png_set_error_fn(png_ptr, (png_voidp)NULL, png_error_fn, png_warning_fn);
/* read file */
if (setjmp(png_jmpbuf(png_ptr))) {
sprintf(errBuf, "read_png - Error : %s", "undetermined");
fclose(memstream);
return FALSE;
}
png_uint_32 imgWidth, imgHeight;
int bitdepth, color_type;
png_read_info(png_ptr, info_ptr);
png_get_IHDR( png_ptr, info_ptr, &imgWidth, &imgHeight,
&bitdepth, &color_type, 0, 0, 0 );
//Number of channels
int channels = png_get_channels(png_ptr, info_ptr);
switch (color_type) {
case PNG_COLOR_TYPE_PALETTE:
png_set_palette_to_rgb(png_ptr);
channels = 3;
info->colorspace = COLOR_TYPE_GCS_RGB;
break;
case PNG_COLOR_TYPE_GRAY:
if (bitdepth < 8)
png_set_gray_1_2_4_to_8(png_ptr);
//And the bitdepth info
bitdepth = 8;
png_set_gray_to_rgb(png_ptr);
info->colorspace = COLOR_TYPE_GCS_RGB;
break;
}
/*if the image has a transperancy set.. convert it to a full Alpha channel..*/
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
png_set_tRNS_to_alpha(png_ptr);
channels+=1;
info->colorspace = COLOR_TYPE_GCS_RGB_ALPHA;
}
//We don't support 16 bit precision.. so if the image Has 16 bits per channel
//precision... round it down to 8.
if (bitdepth == 16)
png_set_strip_16(png_ptr);
info->width = imgWidth;
info->height = imgHeight;
info->channels = channels;
/* read file */
if (setjmp(png_jmpbuf(png_ptr))) {
sprintf(errBuf, "read_png - Error : %s", "undetermined");
fclose(memstream);
return FALSE;
}
png_bytep* rowPtrs[imgHeight];
*raw_image = (unsigned char*)malloc(imgWidth * imgHeight * bitdepth * channels / 8);
const unsigned int stride = imgWidth * bitdepth * channels / 8;
GST_DEBUG("imgWidth:%d, imgHeight:%d, bitdepth:%d, channels:%d, stride:%d", imgWidth,imgHeight,bitdepth,channels, stride );
size_t i;
for (i = 0; i < imgHeight; i++) {
rowPtrs[i] = (png_bytep*)((png_bytep)(*raw_image) + ( i * stride));
}
png_read_image(png_ptr, (png_bytepp)rowPtrs);
//.........这里部分代码省略.........
示例6: load_png
int load_png( char *file_name, int stype )
{
char buf[PNG_BYTES_TO_CHECK], *mess;
unsigned char *rgb, *rgb2, *rgb3;
int i, row, do_prog, bit_depth, color_type, interlace_type, width, height;
unsigned int sig_read = 0;
FILE *fp;
png_bytep *row_pointers, trans;
png_color_16p trans_rgb;
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 pwidth, pheight;
png_colorp png_palette;
if ((fp = fopen(file_name, "rb")) == NULL) return -1;
i = fread(buf, 1, PNG_BYTES_TO_CHECK, fp);
if ( i != PNG_BYTES_TO_CHECK ) goto fail;
i = !png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK);
if ( i<=0 ) goto fail;
rewind( fp );
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) goto fail;
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
png_destroy_read_struct(&png_ptr, NULL, NULL);
goto fail;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
png_destroy_read_struct(&png_ptr, NULL, NULL);
fclose(fp);
return -1;
}
png_init_io(png_ptr, fp);
png_set_sig_bytes(png_ptr, sig_read);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &pwidth, &pheight, &bit_depth, &color_type,
&interlace_type, NULL, NULL);
width = (int) pwidth;
height = (int) pheight;
if ( width > MAX_WIDTH || height > MAX_HEIGHT )
{
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
return TOO_BIG;
}
row_pointers = malloc( sizeof(png_bytep) * height );
if (setjmp(png_jmpbuf(png_ptr))) // If libpng generates an error now, clean up
{
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
free(row_pointers);
return FILE_LIB_ERROR;
}
rgb = NULL;
mess = NULL;
if ( width*height > FILE_PROGRESS ) do_prog = 1;
else do_prog = 0;
if ( stype == 0 )
{
mess = _("Loading PNG image");
rgb = mem_image;
}
if ( stype == 1 )
{
mess = _("Loading clipboard image");
rgb = mem_clipboard;
if ( rgb != NULL ) free( rgb ); // Lose old clipboard
mem_clip_mask_clear(); // Lose old clipboard mask
}
if ( color_type != PNG_COLOR_TYPE_PALETTE || bit_depth>8 ) // RGB PNG file
{
png_set_strip_16(png_ptr);
png_set_gray_1_2_4_to_8(png_ptr);
png_set_palette_to_rgb(png_ptr);
png_set_gray_to_rgb(png_ptr);
if ( stype == 0 )
{
mem_pal_copy( mem_pal, mem_pal_def );
mem_cols = 256;
if ( mem_new( width, height, 3 ) != 0 ) goto file_too_huge;
rgb = mem_image;
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
//.........这里部分代码省略.........
示例7: png_create_read_struct
void *readpng(const unsigned char *base, size_t size, unsigned *_width, unsigned *_height)
{
PngReader reader;
unsigned char *data = 0;
unsigned char **rowptrs = 0;
png_structp p = 0;
png_infop pi = 0;
png_uint_32 width, height;
int bitdepth, colortype, imethod, cmethod, fmethod, i;
p = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
if(p == 0) {
LOG("%s: failed to allocate png read struct\n", fn);
return 0;
}
pi = png_create_info_struct(p);
if(pi == 0) {
LOG("%s: failed to allocate png info struct\n", fn);
goto oops;
}
reader.base = base;
reader.end = base + size;
reader.cursor = base;
if(size < 8 || png_sig_cmp((unsigned char*)base, 0, 8)) {
LOG("%s: header is not a PNG header\n", fn);
goto oops;
}
reader.cursor += 8;
if(setjmp(png_jmpbuf(p))) {
LOG("%s: png library error\n", fn);
oops:
png_destroy_read_struct(&p, &pi, 0);
if(data != 0) free(data);
if(rowptrs != 0) free(rowptrs);
return 0;
}
png_set_read_fn (p, &reader, png_reader_read_data);
png_set_sig_bytes(p, 8);
png_read_info(p, pi);
png_get_IHDR(p, pi, &width, &height, &bitdepth, &colortype,
&imethod, &cmethod, &fmethod);
// printf("PNG: %d x %d (d=%d, c=%d)\n",
// width, height, bitdepth, colortype);
switch(colortype){
case PNG_COLOR_TYPE_PALETTE:
png_set_palette_to_rgb(p);
break;
case PNG_COLOR_TYPE_RGB:
if(png_get_valid(p, pi, PNG_INFO_tRNS)) {
png_set_tRNS_to_alpha(p);
} else {
png_set_filler(p, 0xff, PNG_FILLER_AFTER);
}
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
break;
case PNG_COLOR_TYPE_GRAY:
if(bitdepth < 8) {
png_set_gray_1_2_4_to_8(p);
}
default:
LOG("%s: unsupported (grayscale?) color type\n");
goto oops;
}
if(bitdepth == 16) {
png_set_strip_16(p);
}
data = (unsigned char*) malloc((width * 4) * height);
rowptrs = (unsigned char **) malloc(sizeof(unsigned char*) * height);
if((data == 0) || (rowptrs == 0)){
LOG("could not allocate data buffer\n");
goto oops;
}
for(i = 0; i < height; i++) {
rowptrs[i] = data + ((width * 4) * i);
}
png_read_image(p, rowptrs);
png_destroy_read_struct(&p, &pi, 0);
if(rowptrs != 0) free(rowptrs);
//.........这里部分代码省略.........
示例8: PNGImage_load
void PNGImage_load(PNGImage *self)
{
png_structp png_ptr;
png_infop info_ptr;
int bit_depth;
int color_type;
int interlace_type;
png_uint_32 w;
png_uint_32 h;
int palleteComponents = 3;
int number_passes, row;
FILE *fp = fopen(self->path, "rb");
PNGImage_error_(self, "");
if (!fp)
{
PNGImage_error_(self, "file not found");
return;
}
/* Create and initialize the png_struct with the desired error handler
* functions. If you want to use the default stderr and longjump method,
* you can supply NULL for the last three parameters. We also supply the
* the compiler header file version, so that we know if the application
* was compiled with a compatible version of the library. REQUIRED
*/
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL)
{
fclose(fp);
PNGImage_error_(self, "unable to read png from file");
return;
}
/* Allocate/initialize the memory for image information. REQUIRED. */
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
fclose(fp);
png_destroy_read_struct(&(png_ptr), png_infopp_NULL, png_infopp_NULL);
PNGImage_error_(self, "error allocating png struct");
return;
}
/* Set error handling if you are using the setjmp/longjmp method (this is
* the normal method of doing things with libpng). REQUIRED unless you
* set up your own error handlers in the png_create_read_struct() earlier.
*/
if (setjmp(png_jmpbuf(png_ptr)))
{
/* Free all of the memory associated with the png_ptr and info_ptr */
png_destroy_read_struct(&(png_ptr), &(info_ptr), png_infopp_NULL);
fclose(fp);
PNGImage_error_(self, self->path);
return;
}
/* Set up the input control if you are using standard C streams */
png_init_io(png_ptr, fp);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &w, &h, &(bit_depth),
&(color_type), &(interlace_type), int_p_NULL, int_p_NULL);
self->width = w;
self->height = h;
/* tell libpng to strip 16 bit/color files down to 8 bits/color */
png_set_strip_16(png_ptr);
/* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
* byte into separate bytes (useful for paletted and grayscale images).
*/
png_set_packing(png_ptr);
/* Expand paletted colors into true RGB triplets */
/*
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_rgb(png_ptr);
*/
/* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_gray_1_2_4_to_8(png_ptr);
/* Expand paletted or RGB images with transparency to full alpha channels
* so the data will be available as RGBA quartets.
*/
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
{
png_set_tRNS_to_alpha(png_ptr);
palleteComponents = 4;
}
/* swap bytes of 16 bit files to least significant byte first */
//.........这里部分代码省略.........
示例9: rep
// ######################################################################
PngParser::PngParser(const char* filename)
:
rep(new Rep(filename))
{
errno = 0;
rep->file = fopen(filename, "rb");
if (rep->file == 0) rep->onError("couldn't open file for png reading");
const size_t nheader = 8;
png_byte header[nheader];
if (fread(header, 1, nheader, rep->file) != nheader) rep->onError("short read on png file header");
int is_png = !png_sig_cmp(header, 0, nheader);
if (!is_png) rep->onError("file was not a png image file");
rep->pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
if (rep->pngPtr == 0) rep->onError("png_create_read_struct failed");
rep->infoPtr = png_create_info_struct(rep->pngPtr);
if (rep->infoPtr == 0) rep->onError("png_create_info_struct failed");
rep->endPtr = png_create_info_struct(rep->pngPtr);
if (rep->endPtr == 0) rep->onError("png_create_info_struct failed");
png_init_io(rep->pngPtr, rep->file);
png_set_sig_bytes(rep->pngPtr, nheader);
png_read_info(rep->pngPtr, rep->infoPtr);
rep->bitDepth = png_get_bit_depth(rep->pngPtr, rep->infoPtr);
rep->colorType = png_get_color_type(rep->pngPtr, rep->infoPtr);
if (rep->bitDepth == 16)
png_set_strip_16(rep->pngPtr);
else if (rep->bitDepth < 8 && (rep->colorType == PNG_COLOR_TYPE_GRAY))
png_set_gray_1_2_4_to_8(rep->pngPtr);
else if (rep->bitDepth != 8 && (rep->colorType != PNG_COLOR_TYPE_PALETTE))
rep->onError(sformat("invalid bit-depth(%d)/color-mode(%d) "
"combination", rep->bitDepth, rep->colorType));
// Strip out the alpha channel, if present
if (rep->colorType & PNG_COLOR_MASK_ALPHA)
png_set_strip_alpha(rep->pngPtr);
if (rep->colorType & PNG_COLOR_MASK_PALETTE)
png_set_palette_to_rgb(rep->pngPtr);
// This must come after any+all transformations are specified
png_read_update_info(rep->pngPtr, rep->infoPtr);
// These calls must come after png_read_update_info, so that we get
// values that reflect any transformations
rep->width = png_get_image_width(rep->pngPtr, rep->infoPtr);
rep->height = png_get_image_height(rep->pngPtr, rep->infoPtr);
rep->rowBytes = png_get_rowbytes(rep->pngPtr, rep->infoPtr);
rep->numChannels = png_get_channels(rep->pngPtr, rep->infoPtr);
ASSERT(rep->rowBytes = rep->width*rep->numChannels);
// run-time mmx PNG optimizations (nate)
#if defined(HAVE_PNG_ASM_FLAGS)
const png_uint_32 flags = png_get_asm_flags(rep->pngPtr);
const png_uint_32 mask =
png_get_asm_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE);
png_set_asm_flags(rep->pngPtr, flags | mask);
#endif
}
示例10: gst_pngdec_caps_create_and_set
static GstFlowReturn
gst_pngdec_caps_create_and_set (GstPngDec * pngdec)
{
GstFlowReturn ret = GST_FLOW_OK;
GstCaps *caps = NULL, *res = NULL;
GstPadTemplate *templ = NULL;
gint bpc = 0, color_type;
png_uint_32 width, height;
g_return_val_if_fail (GST_IS_PNGDEC (pngdec), GST_FLOW_ERROR);
/* Get bits per channel */
bpc = png_get_bit_depth (pngdec->png, pngdec->info);
/* We don't handle 16 bits per color, strip down to 8 */
if (bpc == 16) {
GST_LOG_OBJECT (pngdec,
"this is a 16 bits per channel PNG image, strip down to 8 bits");
png_set_strip_16 (pngdec->png);
}
/* Get Color type */
color_type = png_get_color_type (pngdec->png, pngdec->info);
#if 0
/* We used to have this HACK to reverse the outgoing bytes, but the problem
* that originally required the hack seems to have been in ffmpegcolorspace's
* RGBA descriptions. It doesn't seem needed now that's fixed, but might
* still be needed on big-endian systems, I'm not sure. J.S. 6/7/2007 */
if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
png_set_bgr (pngdec->png);
#endif
/* Gray scale converted to RGB and upscaled to 8 bits */
if ((color_type == PNG_COLOR_TYPE_GRAY_ALPHA) ||
(color_type == PNG_COLOR_TYPE_GRAY)) {
GST_LOG_OBJECT (pngdec, "converting grayscale png to RGB");
png_set_gray_to_rgb (pngdec->png);
if (bpc < 8) { /* Convert to 8 bits */
GST_LOG_OBJECT (pngdec, "converting grayscale image to 8 bits");
png_set_gray_1_2_4_to_8 (pngdec->png);
}
}
/* Palette converted to RGB */
if (color_type == PNG_COLOR_TYPE_PALETTE) {
GST_LOG_OBJECT (pngdec, "converting palette png to RGB");
png_set_palette_to_rgb (pngdec->png);
}
/* Update the info structure */
png_read_update_info (pngdec->png, pngdec->info);
/* Get IHDR header again after transformation settings */
png_get_IHDR (pngdec->png, pngdec->info, &width, &height,
&bpc, &pngdec->color_type, NULL, NULL, NULL);
pngdec->width = width;
pngdec->height = height;
GST_LOG_OBJECT (pngdec, "this is a %dx%d PNG image", pngdec->width,
pngdec->height);
switch (pngdec->color_type) {
case PNG_COLOR_TYPE_RGB:
GST_LOG_OBJECT (pngdec, "we have no alpha channel, depth is 24 bits");
pngdec->bpp = 24;
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
GST_LOG_OBJECT (pngdec, "we have an alpha channel, depth is 32 bits");
pngdec->bpp = 32;
break;
default:
GST_ELEMENT_ERROR (pngdec, STREAM, NOT_IMPLEMENTED, (NULL),
("pngdec does not support this color type"));
ret = GST_FLOW_NOT_SUPPORTED;
goto beach;
}
caps = gst_caps_new_simple ("video/x-raw-rgb",
"width", G_TYPE_INT, pngdec->width,
"height", G_TYPE_INT, pngdec->height,
"bpp", G_TYPE_INT, pngdec->bpp,
"framerate", GST_TYPE_FRACTION, pngdec->fps_n, pngdec->fps_d, NULL);
templ = gst_static_pad_template_get (&gst_pngdec_src_pad_template);
res = gst_caps_intersect (caps, gst_pad_template_get_caps (templ));
gst_caps_unref (caps);
gst_object_unref (templ);
if (!gst_pad_set_caps (pngdec->srcpad, res))
ret = GST_FLOW_NOT_NEGOTIATED;
GST_DEBUG_OBJECT (pngdec, "our caps %" GST_PTR_FORMAT, res);
gst_caps_unref (res);
//.........这里部分代码省略.........
示例11: ReadPNG
unsigned char * ReadPNG(FILE * fp, unsigned int & sizeX, unsigned int &sizeY, int &img_depth, int &img_color_type, unsigned char *** row_pointer_ptr)
{
png_structp png_ptr;
png_bytepp row_pointers;
png_infop info_ptr;
int interlace_type;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, (png_error_ptr)png_cexcept_error, (png_error_ptr)NULL);
if (png_ptr == NULL)
{
exit(1);
return NULL;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
fprintf(stderr,"VSImage ERROR : PNG info_ptr == NULL !!!\n");
exit(1);
return NULL;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
/* Free all of the memory associated with the png_ptr and info_ptr */
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
/* If we get here, we had a problem reading the file */
exit(1);
return NULL;
}
png_init_io(png_ptr, fp);
//png_set_sig_bytes(png_ptr, 8);
png_read_info(png_ptr, info_ptr); /* read all PNG info up to image data */
png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&sizeX, (png_uint_32 *)&sizeY, &img_depth, &img_color_type, &interlace_type, NULL, NULL);
# if __BYTE_ORDER != __BIG_ENDIAN
if (img_depth==16)
png_set_swap (png_ptr);
#endif
if (img_depth==16)//for now
png_set_strip_16(png_ptr);
if (img_color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png_ptr);
if (img_color_type == PNG_COLOR_TYPE_GRAY && img_depth < 8)
png_set_gray_1_2_4_to_8(png_ptr);
png_set_expand (png_ptr);
png_read_update_info (png_ptr,info_ptr);
png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&sizeX, (png_uint_32 *)&sizeY, &img_depth, &img_color_type, &interlace_type, NULL, NULL);
row_pointers = (unsigned char **)malloc (sizeof (unsigned char *) *sizeY);
int numchan=1;
if (img_color_type&PNG_COLOR_MASK_COLOR)
numchan =3;
if (img_color_type &PNG_COLOR_MASK_PALETTE)
numchan =1;
if (img_color_type&PNG_COLOR_MASK_ALPHA)
numchan++;
unsigned long stride = numchan*sizeof (unsigned char)*img_depth/8;
unsigned char * image = (unsigned char *) malloc (stride*sizeX*sizeY);
for (unsigned int i=0;i<sizeY;i++)
{
row_pointers[i] = &image[i*stride*sizeX];
}
png_read_image (png_ptr,row_pointers);
unsigned char * result;
result = image;
//free (row_pointers);
*row_pointer_ptr=row_pointers;
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return result;
}
示例12: png_create_read_struct
bool PNGImageFileType::read( Image *OSG_PNG_ARG(pImage ),
std::istream &OSG_PNG_ARG(is ),
const std::string &OSG_PNG_ARG(mimetype))
{
#ifdef OSG_WITH_PNG
bool retCode;
Image::PixelFormat pixelFormat = OSG::Image::OSG_INVALID_PF;
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width, wc, height, h, i, res_x, res_y;
png_byte bit_depth, channels, color_type;
png_bytep *row_pointers, base;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
if(!png_ptr)
return false;
png_set_error_fn(png_ptr, 0, &errorOutput, &warningOutput);
info_ptr = png_create_info_struct(png_ptr);
if(!info_ptr)
{
png_destroy_read_struct(&png_ptr, 0, 0);
return false;
}
if(setjmp(png_ptr->jmpbuf))
{
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
return false;
}
png_set_read_fn(png_ptr, &is, &isReadFunc);
png_read_info(png_ptr, info_ptr);
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
res_x = png_get_x_pixels_per_meter(png_ptr, info_ptr);
res_y = png_get_y_pixels_per_meter(png_ptr, info_ptr);
channels = png_get_channels(png_ptr, info_ptr);
color_type = png_get_color_type(png_ptr, info_ptr);
// Convert paletted images to RGB
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
png_set_palette_to_rgb(png_ptr);
channels = 3;
bit_depth = 8;
}
// Convert < 8 bit to 8 bit
if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
{
png_set_gray_1_2_4_to_8(png_ptr);
bit_depth = 8;
}
#if BYTE_ORDER == LITTLE_ENDIAN
if (bit_depth == 16)
png_set_swap(png_ptr);
#endif
// Add a full alpha channel if there is transparency
// information in a tRNS chunk
if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
{
png_set_tRNS_to_alpha(png_ptr);
++channels;
}
Int32 dataType;
switch (bit_depth)
{
case 8:
dataType = Image::OSG_UINT8_IMAGEDATA;
break;
case 16:
dataType = Image::OSG_UINT16_IMAGEDATA;
break;
default:
FWARNING (( "Invalid bit_depth: %d, can not read png-data\n",
bit_depth ));
return false;
}
switch(channels)
{
case 1:
pixelFormat = Image::OSG_L_PF;
break;
case 2:
pixelFormat = Image::OSG_LA_PF;
break;
case 3:
//.........这里部分代码省略.........
示例13: OSG_CHECK_ARG
UInt64 PNGImageFileType::restoreData( Image *OSG_PNG_ARG (pImage ),
const UChar8 *OSG_PNG_ARG (buffer ),
Int32 OSG_CHECK_ARG(memSize))
{
#ifdef OSG_WITH_PNG
UInt64 retCode;
Image::PixelFormat pixelFormat = Image::OSG_INVALID_PF;
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width, wc, height, h, i;
png_byte bit_depth, channels, color_type;
png_bytep *row_pointers, base;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
if(!png_ptr)
{
return 0;
}
png_set_error_fn(png_ptr, 0, &errorOutput, &warningOutput);
info_ptr = png_create_info_struct(png_ptr);
if(!info_ptr)
{
png_destroy_read_struct(&png_ptr, 0, 0);
return 0;
}
if(setjmp(png_ptr->jmpbuf))
{
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
return 0;
}
BufferInfo bufferInfo;
bufferInfo.buffer = const_cast<UChar8 *>(buffer);
bufferInfo.length = 0;
png_set_read_fn(png_ptr, static_cast<void *>(&bufferInfo), user_read_data);
png_read_info(png_ptr, info_ptr);
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
channels = png_get_channels(png_ptr, info_ptr);
color_type = png_get_color_type(png_ptr, info_ptr);
// Convert paletted images to RGB
if(color_type == PNG_COLOR_TYPE_PALETTE)
{
png_set_palette_to_rgb(png_ptr);
channels = 3;
bit_depth = 8;
}
// Convert < 8 bit to 8 bit
if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
{
png_set_gray_1_2_4_to_8(png_ptr);
bit_depth = 8;
}
#if BYTE_ORDER == LITTLE_ENDIAN
if (bit_depth == 16)
png_set_swap(png_ptr);
#endif
// Add a full alpha channel if there is transparency
// information in a tRNS chunk
if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
{
png_set_tRNS_to_alpha(png_ptr);
++channels;
}
Int32 dataType;
switch (bit_depth)
{
case 8:
dataType = Image::OSG_UINT8_IMAGEDATA;
break;
case 16:
dataType = Image::OSG_UINT16_IMAGEDATA;
break;
default:
FWARNING (( "Invalid bit_depth: %d, can not read png-data\n",
bit_depth ));
return false;
}
switch(channels)
{
case 1:
pixelFormat = Image::OSG_L_PF;
break;
case 2:
//.........这里部分代码省略.........
示例14: LoadPNGBuff
static RGBAImagePtr LoadPNGBuff (unsigned char* fbuffer)
{
png_byte** row_pointers;
png_bytep p_fbuffer;
p_fbuffer = fbuffer;
// the reading glue
// http://www.libpng.org/pub/png/libpng-manual.html
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
(png_voidp)NULL, user_error_fn, user_warning_fn);
if (!png_ptr)
{
rError() << "libpng error: png_create_read_struct\n";
return RGBAImagePtr();
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
{
png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
rError() << "libpng error: png_create_info_struct (info_ptr)" << std::endl;
return RGBAImagePtr();
}
png_infop end_info = png_create_info_struct(png_ptr);
if (!end_info)
{
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
rError() << "libpng error: png_create_info_struct (end_info)" << std::endl;
return RGBAImagePtr();
}
// configure the read function
png_set_read_fn(png_ptr, (png_voidp)&p_fbuffer, (png_rw_ptr)&user_read_data);
if (setjmp(png_jmpbuf(png_ptr)))
{
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
return RGBAImagePtr();
}
png_read_info(png_ptr, info_ptr);
int bit_depth = png_get_bit_depth(png_ptr, info_ptr);
int color_type = png_get_color_type(png_ptr, info_ptr);
// we want to treat all images the same way
// The following code transforms grayscale images of less than 8 to 8 bits,
// changes paletted images to RGB, and adds a full alpha channel if there is
// transparency information in a tRNS chunk.
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
png_set_palette_to_rgb(png_ptr);
}
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
{
#if PNG_LIBPNG_VER < 10400
png_set_gray_1_2_4_to_8(png_ptr);
#else
png_set_expand_gray_1_2_4_to_8(png_ptr);
#endif
}
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
{
png_set_tRNS_to_alpha(png_ptr);
}
if (!(color_type & PNG_COLOR_MASK_ALPHA))
{
// Set the background color to draw transparent and alpha images over.
png_color_16 my_background, *image_background;
if (png_get_bKGD(png_ptr, info_ptr, &image_background))
{
png_set_background(png_ptr, image_background, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
}
else
{
png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
}
// Add alpha byte after each RGB triplet
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
}
// read the sucker in one chunk
png_read_update_info(png_ptr, info_ptr);
color_type = png_get_color_type(png_ptr, info_ptr);
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
int width = png_get_image_width(png_ptr, info_ptr);
//.........这里部分代码省略.........
示例15: readPng
Bool
readPng (const char *filename,
char **data,
unsigned int *width,
unsigned int *height)
{
static const int PNG_SIG_SIZE = 8;
unsigned char png_sig[PNG_SIG_SIZE];
FILE *file;
int sig_bytes;
png_struct *png;
png_info *info;
png_uint_32 png_width, png_height;
int depth, color_type, interlace, i;
unsigned int pixel_size;
png_byte **row_pointers;
file = fopen (filename, "r");
if (!file)
{
char *home, *imagedir;
home = getenv ("HOME");
if (home)
{
imagedir = malloc (strlen (home) +
strlen (HOME_IMAGEDIR) +
strlen (filename) + 3);
if (imagedir)
{
sprintf (imagedir, "%s/%s/%s", home, HOME_IMAGEDIR, filename);
file = fopen (imagedir, "r");
free (imagedir);
}
}
if (!file)
{
imagedir = malloc (strlen (IMAGEDIR) + strlen (filename) + 2);
if (imagedir)
{
sprintf (imagedir, "%s/%s", IMAGEDIR, filename);
file = fopen (imagedir, "r");
free (imagedir);
}
if (!file)
return FALSE;
}
}
sig_bytes = fread (png_sig, 1, PNG_SIG_SIZE, file);
if (png_check_sig (png_sig, sig_bytes) == 0)
{
fclose (file);
return FALSE;
}
png = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png)
{
fclose (file);
return FALSE;
}
info = png_create_info_struct (png);
if (info == NULL)
{
fclose (file);
png_destroy_read_struct (&png, NULL, NULL);
return FALSE;
}
png_init_io (png, file);
png_set_sig_bytes (png, sig_bytes);
png_read_info (png, info);
png_get_IHDR (png, info,
&png_width, &png_height, &depth,
&color_type, &interlace, NULL, NULL);
*width = png_width;
*height = png_height;
/* convert palette/gray image to rgb */
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb (png);
/* expand gray bit depth if needed */
if (color_type == PNG_COLOR_TYPE_GRAY && depth < 8)
png_set_gray_1_2_4_to_8 (png);
/* transform transparency to alpha */
if (png_get_valid(png, info, PNG_INFO_tRNS))
png_set_tRNS_to_alpha (png);
if (depth == 16)
png_set_strip_16 (png);
if (depth < 8)
//.........这里部分代码省略.........