本文整理汇总了C++中png_jmpbuf函数的典型用法代码示例。如果您正苦于以下问题:C++ png_jmpbuf函数的具体用法?C++ png_jmpbuf怎么用?C++ png_jmpbuf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了png_jmpbuf函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: fopen
bool YImage::save( const char* fname, bool fast )
const
{
FILE* fp = NULL ;
bool rval = true ;
png_structp png_ptr = NULL ;
png_infop info_ptr = NULL ;
// Open the file for reading in binary mode.
fp = fopen( fname, "wb" ) ;
if( !fp )
{
fprintf( stderr, ERROR_STRING_OPEN, fname ) ;
rval = false ;
goto YImage_save_cleanup ;
}
// Allocate the png structs.
png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, NULL, NULL, NULL ) ;
if( !png_ptr )
{
fprintf( stderr, ERROR_STRING_WRITING, fname ) ;
rval = false ;
goto YImage_save_cleanup ;
}
info_ptr = png_create_info_struct( png_ptr ) ;
if( !info_ptr )
{
fprintf( stderr, ERROR_STRING_WRITING, fname ) ;
rval = false ;
goto YImage_save_cleanup ;
}
// Set up the png error routine.
if( setjmp(png_jmpbuf(png_ptr)) )
{
fprintf( stderr, ERROR_STRING_WRITING, fname ) ;
rval = false ;
goto YImage_save_cleanup ;
}
// Give libpng the FILE*.
// png_init_io( png_ptr, fp ) ;
// or
// use our own write callback
png_set_write_fn( png_ptr, fp, (png_rw_ptr) user_write_data, user_flush_data ) ;
// We'll use the low-level interface since the high-level interface won't handle
// png_set_filler() which we need to tell libpng to strip out the A from our
// 4-byte pixels.
// First we set and write the info struct.
png_set_IHDR(
png_ptr, info_ptr,
m_width, m_height,
8, PNG_COLOR_TYPE_RGB_ALPHA,
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT
) ;
png_write_info( png_ptr, info_ptr ) ;
// If we've been asked to write quickly, speed up the compression.
if( fast ) png_set_compression_level( png_ptr, Z_BEST_SPEED );
// Then we set up transforms.
/*
// 1. tell libpng to strip out the filler byte in our 4-byte pixels
// if YPixel::a comes after any other member (b,g,r), we strip AFTER
if( offsetof( YPixel, a ) > offsetof( YPixel, b ) ) {
png_set_filler( png_ptr, 0, PNG_FILLER_AFTER ) ;
// printf("alpha after\n");
} else {
png_set_filler( png_ptr, 0, PNG_FILLER_BEFORE ) ;
// printf("alpha before\n");
}
*/
if( offsetof( YPixel, a ) < offsetof( YPixel, b ) )
png_set_swap_alpha( png_ptr ) ;
// 2. tell libpng how our color triples are stored (b < r or vice versa)
if( offsetof( YPixel, b ) < offsetof( YPixel, r ) )
{
png_set_bgr( png_ptr ) ;
// printf("bgr\n") ;
}
// else { printf("rgb\n"); }
// printf( "offsetof r, b: %d %d\n", offsetof( YPixel, r ), offsetof( YPixel, b ) );
// Finally we create a row_pointers[] pointing into our data* and write the png out to the FILE*.
{
// 1. allocate row pointers array
png_bytep* row_pointers = (png_bytep*) png_malloc( png_ptr, m_height * sizeof(png_bytep) ) ;
// 2. point row pointers into m_data
for( int i = 0 ; i < m_height ; ++i ) {
row_pointers[i] = (png_bytep) (m_data + i*m_width) ;
}
// 3. write the image data
png_write_image( png_ptr, row_pointers ) ;
// 4. free row pointers array
png_free( png_ptr, row_pointers ) ;
}
//.........这里部分代码省略.........
示例2: main
//.........这里部分代码省略.........
sample_size = sizeof(int32_t) * 2;
reader = read_samples_int32;
break;
case FORMAT_UINT32:
sample_size = sizeof(uint32_t) * 2;
reader = read_samples_uint32;
break;
case FORMAT_FLOAT32:
sample_size = sizeof(float) * 2;
reader = read_samples_float32;
break;
case FORMAT_FLOAT64:
sample_size = sizeof(double) * 2;
reader = read_samples_float64;
break;
}
params.reader = reader;
uint64_t nsamples = size / sample_size;
if ((params.clip > 0) && (nsamples > params.clip)) {
nsamples = params.clip;
}
if (params.overlap > params.fftsize) {
fprintf(stderr, "Overlap of %d is greater than FFT frame size of %d.\n",
params.overlap, params.fftsize);
return EXIT_FAILURE;
}
params.frames = nsamples / (params.fftsize - params.overlap);
if (!strcmp(outfile, "")) {
strcpy(outfile, infile);
strcat(outfile, ".png");
}
if (verbose) {
printf("Reading %s samples from %s...\n", fmt_s, infile);
printf("Writing %d x %d output to %s...\n", params.fftsize,
params.frames, outfile);
}
FILE *writefp = fopen(outfile, "wb");
if (!writefp) {
fprintf(stderr, "Error: failed to write to %s.\n", outfile);
return EXIT_FAILURE;
}
png_structp png_ptr =
png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
fprintf(stderr, "Error: could not initialize write struct.\n");
return EXIT_FAILURE;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
fprintf(stderr, "Error: could not initialize info struct.\n");
png_destroy_write_struct(&png_ptr, NULL);
return EXIT_FAILURE;
}
if (setjmp(png_jmpbuf(png_ptr))) {
fprintf(stderr, "Error: libpng error.\n");
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(writefp);
return EXIT_FAILURE;
}
if (verbose)
printf("Writing PNG header..\n");
png_init_io(png_ptr, writefp);
png_set_IHDR(png_ptr, info_ptr, params.fftsize, params.frames, 8,
PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_write_info(png_ptr, info_ptr);
if (verbose)
printf("Rendering (this may take a while)...\n");
waterfall(png_ptr, readfp, params);
if (verbose)
printf("Writing PNG footer...\n");
png_write_end(png_ptr, NULL);
png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
png_destroy_write_struct(&png_ptr, NULL);
if (verbose)
printf("Cleaning up...\n");
fclose(writefp);
fclose(readfp);
destroy_window(win);
if (verbose)
print_scale_stats();
return EXIT_SUCCESS;
}
示例3: fopen
char *sng_load_png_texture(const char *filename, int flipVertical, int flipHorizontal, int pre_multiply_alpha,
int *w, int *h, int *hasAlpha, char *whynot, int whynotlen)
{
#ifndef WITHOUTOPENGL
int i, j, bit_depth, color_type, row_bytes, image_data_row_bytes;
png_byte header[8];
png_uint_32 tw, th;
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
png_infop end_info = NULL;
png_byte *image_data = NULL;
FILE *fp = fopen(filename, "rb");
if (!fp) {
snprintf(whynot, whynotlen, "Failed to open '%s': %s",
filename, strerror(errno));
return 0;
}
if (fread(header, 1, 8, fp) != 8) {
snprintf(whynot, whynotlen, "Failed to read 8 byte header from '%s'\n",
filename);
goto cleanup;
}
if (png_sig_cmp(header, 0, 8)) {
snprintf(whynot, whynotlen, "'%s' isn't a png file.",
filename);
goto cleanup;
}
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
if (!png_ptr) {
snprintf(whynot, whynotlen,
"png_create_read_struct() returned NULL");
goto cleanup;
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
snprintf(whynot, whynotlen,
"png_create_info_struct() returned NULL");
goto cleanup;
}
end_info = png_create_info_struct(png_ptr);
if (!end_info) {
snprintf(whynot, whynotlen,
"2nd png_create_info_struct() returned NULL");
goto cleanup;
}
if (setjmp(png_jmpbuf(png_ptr))) {
snprintf(whynot, whynotlen, "libpng encounted an error");
goto cleanup;
}
png_init_io(png_ptr, fp);
png_set_sig_bytes(png_ptr, 8);
/*
* PNG_TRANSFORM_STRIP_16 |
* PNG_TRANSFORM_PACKING forces 8 bit
* PNG_TRANSFORM_EXPAND forces to expand a palette into RGB
*/
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING | PNG_TRANSFORM_EXPAND, NULL);
png_get_IHDR(png_ptr, info_ptr, &tw, &th, &bit_depth, &color_type, NULL, NULL, NULL);
if (bit_depth != 8) {
snprintf(whynot, whynotlen, "load_png_texture only supports 8-bit image channel depth");
goto cleanup;
}
if (color_type != PNG_COLOR_TYPE_RGB && color_type != PNG_COLOR_TYPE_RGB_ALPHA) {
snprintf(whynot, whynotlen, "load_png_texture only supports RGB and RGBA");
goto cleanup;
}
if (w)
*w = tw;
if (h)
*h = th;
int has_alpha = (color_type == PNG_COLOR_TYPE_RGB_ALPHA);
if (hasAlpha)
*hasAlpha = has_alpha;
row_bytes = png_get_rowbytes(png_ptr, info_ptr);
image_data_row_bytes = row_bytes;
/* align to 4 byte boundary */
if (image_data_row_bytes & 0x03)
image_data_row_bytes += 4 - (image_data_row_bytes & 0x03);
png_bytepp row_pointers = png_get_rows(png_ptr, info_ptr);
image_data = malloc(image_data_row_bytes * th * sizeof(png_byte) + 15);
if (!image_data) {
snprintf(whynot, whynotlen, "malloc failed in load_png_texture");
goto cleanup;
//.........这里部分代码省略.........
示例4: load_inp_png_file
short load_inp_png_file(ImageData& img, const std::string& fname_inp, ProgramOptions& opts)
{
FILE* pngfile = fopen(fname_inp.c_str(),"rb");
if (pngfile == NULL) {
perror(fname_inp.c_str());
return ERR_CANT_OPEN;
}
png_byte header[8];
if (fread(header,8,1,pngfile) != 1) {
perror(fname_inp.c_str());
fclose(pngfile);
return ERR_FILE_READ;
}
if (png_sig_cmp(header,0,8)) {
LogErr("%s: Not a PNG file",fname_inp.c_str());
fclose(pngfile);
return ERR_BAD_FILE;
}
img.png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!img.png_ptr)
{
LogErr("%s: png_create_read_struct error",fname_inp.c_str());
fclose(pngfile);
return ERR_BAD_FILE;
}
img.info_ptr=png_create_info_struct(img.png_ptr);
if (!img.info_ptr)
{
png_destroy_read_struct(&img.png_ptr, (png_infopp)NULL, (png_infopp)NULL);
LogErr("%s: png_create_info_struct error",fname_inp.c_str());
fclose(pngfile);
return ERR_BAD_FILE;
}
img.end_info=png_create_info_struct(img.png_ptr);
if (!img.end_info)
{
png_destroy_read_struct(&img.png_ptr, &img.info_ptr, (png_infopp)NULL);
LogErr("%s: png_create_info_struct error",fname_inp.c_str());
fclose(pngfile);
return ERR_BAD_FILE;
}
if (setjmp(png_jmpbuf(img.png_ptr)))
{
png_destroy_read_struct(&img.png_ptr, &img.info_ptr, &img.end_info);
LogErr("%s: PNG error",fname_inp.c_str());
fclose(pngfile);
exit(1);
}
png_init_io(img.png_ptr, pngfile);
png_set_sig_bytes(img.png_ptr,8);
int trafo=PNG_TRANSFORM_PACKING|PNG_TRANSFORM_STRIP_16|PNG_TRANSFORM_EXPAND;
png_read_png(img.png_ptr, img.info_ptr, trafo , NULL);
int bit_depth, interlace_type, compression_type, filter_method;
png_get_IHDR(img.png_ptr, img.info_ptr, &img.width, &img.height, &bit_depth, &img.color_type,
&interlace_type, &compression_type, &filter_method);
if ((img.color_type & PNG_COLOR_MASK_COLOR)==0)
{
LogErr("%s: Grayscale image not supported",fname_inp.c_str());
fclose(pngfile);
return ERR_BAD_FILE;
}
fclose(pngfile);
if (img.color_type==PNG_COLOR_TYPE_PALETTE)
{
LogErr("Invalid format. This shouldn't happen. PNG_TRANSFORM_EXPAND transforms image to RGB.");
return ERR_BAD_FILE;
}
if (img.color_type & PNG_COLOR_MASK_ALPHA) {
img.col_bits = 32;
} else {
img.col_bits = 24;
}
return ERR_OK;
}
示例5: gst_pngdec_chain
static GstFlowReturn
gst_pngdec_chain (GstPad * pad, GstBuffer * buffer)
{
GstPngDec *pngdec;
GstFlowReturn ret = GST_FLOW_OK;
pngdec = GST_PNGDEC (gst_pad_get_parent (pad));
GST_LOG_OBJECT (pngdec, "Got buffer, size=%u", GST_BUFFER_SIZE (buffer));
if (G_UNLIKELY (!pngdec->setup))
goto not_configured;
/* Something is going wrong in our callbacks */
ret = pngdec->ret;
if (G_UNLIKELY (ret != GST_FLOW_OK)) {
GST_WARNING_OBJECT (pngdec, "we have a pending return code of %d", ret);
goto beach;
}
/* Let libpng come back here on error */
if (setjmp (png_jmpbuf (pngdec->png))) {
GST_WARNING_OBJECT (pngdec, "error during decoding");
ret = GST_FLOW_ERROR;
goto beach;
}
pngdec->in_timestamp = GST_BUFFER_TIMESTAMP (buffer);
pngdec->in_duration = GST_BUFFER_DURATION (buffer);
/* Progressive loading of the PNG image */
png_process_data (pngdec->png, pngdec->info, GST_BUFFER_DATA (buffer),
GST_BUFFER_SIZE (buffer));
if (pngdec->image_ready) {
if (pngdec->framed) {
/* Reset ourselves for the next frame */
gst_pngdec_libpng_clear (pngdec);
gst_pngdec_libpng_init (pngdec);
GST_LOG_OBJECT (pngdec, "setting up callbacks for next frame");
png_set_progressive_read_fn (pngdec->png, pngdec,
user_info_callback, user_endrow_callback, user_end_callback);
} else {
GST_LOG_OBJECT (pngdec, "sending EOS");
pngdec->ret = gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ());
}
pngdec->image_ready = FALSE;
}
/* grab new return code */
ret = pngdec->ret;
/* And release the buffer */
gst_buffer_unref (buffer);
beach:
gst_object_unref (pngdec);
return ret;
/* ERRORS */
not_configured:
{
GST_LOG_OBJECT (pngdec, "we are not configured yet");
ret = GST_FLOW_WRONG_STATE;
goto beach;
}
}
示例6: fopen
void CachedTexture::reload() {
//..... load file ......
GLenum internal_format = GL_RGB;
GLenum data_format = GL_RGB;
unsigned char *data = NULL;
if (filename.size() >= 4 && filename.substr(filename.size()-4,4) == ".png") {
//Load a png file, as per the libpng docs:
FILE *fp = fopen(filename.c_str(), "rb");
if (!fp) {
cerr << " cannot open file." << endl;
return;
}
png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, (png_error_ptr)NULL, (png_error_ptr)NULL);
if (!png) {
cerr << " cannot alloc read struct." << endl;
fclose(fp);
return;
}
png_infop info = png_create_info_struct(png);
if (!info) {
cerr << " cannot alloc info struct." << endl;
png_destroy_read_struct(&png, (png_infopp)NULL, (png_infopp)NULL);
fclose(fp);
return;
}
png_bytep *row_pointers = NULL;
if (setjmp(png_jmpbuf(png))) {
cerr << " png interal error." << endl;
png_destroy_read_struct(&png, &info, (png_infopp)NULL);
if (data != NULL) delete[] data;
if (row_pointers != NULL) delete[] row_pointers;
fclose(fp);
return;
}
png_init_io(png, fp);
png_read_info(png, info);
w = png_get_image_width(png, info);
h = png_get_image_height(png, info);
{ //find power-of-two dimensions...
tw = 1;
while (tw < w) tw *= 2;
th = 1;
while (th < h) th *= 2;
}
if (!pad && (tw != w || th != h)) {
if (!have_ARB_texture_non_power_of_two()) {
cerr << "WARNING: trying to load texture of size " << w << " x " << h << ", but non-power-of-two textures not supported." << endl;
}
tw = w;
th = h;
}
if (png_get_color_type(png, info) == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png);
if (png_get_bit_depth(png, info) < 8)
png_set_packing(png);
if (png_get_bit_depth(png,info) == 16)
png_set_strip_16(png);
png_read_update_info(png, info);
unsigned int rowbytes = png_get_rowbytes(png, info);
//Make sure it's the format we think it is...
bool problem = false;
if (png_get_color_type(png, info) == PNG_COLOR_TYPE_GRAY) {
data_format = internal_format = GL_LUMINANCE;
if (rowbytes != w*1) problem = true;
} else if (png_get_color_type(png, info) == PNG_COLOR_TYPE_GRAY_ALPHA) {
data_format = internal_format = GL_LUMINANCE_ALPHA;
if (rowbytes != w*2) problem = true;
} else if (png_get_color_type(png, info) == PNG_COLOR_TYPE_PALETTE || png_get_color_type(png, info) == PNG_COLOR_TYPE_RGB) {
data_format = internal_format = GL_RGB;
if (rowbytes != w*3) problem = true;
} else if (png_get_color_type(png, info) == PNG_COLOR_TYPE_RGB_ALPHA) {
data_format = internal_format = GL_RGBA;
if (rowbytes != w*4) problem = true;
} else {
cerr << " unknown color format." << endl;
problem = true;
}
if (problem) {
cerr << " color format problem. (rowbytes: " << rowbytes << " w:" << w << ")" << endl;
png_destroy_read_struct(&png, &info, NULL);
fclose(fp);
return;
}
unsigned int pixelbytes = rowbytes / w;
assert(rowbytes == pixelbytes * w); //sanity check, should have bailed earlier if this was the case.
data = new uint8_t[th*tw*pixelbytes];
row_pointers = new png_bytep[th];
if (flip) {
//texture origin goes top-left, as in most images:
for (unsigned int r = 0; r < th; ++r) {
row_pointers[r] = (png_bytep)(data + r*pixelbytes*tw);
}
} else {
//texture origin goes bottom-left, as GL says:
for (unsigned int r = 0; r < th; ++r) {
row_pointers[th-1-r] = (png_bytep)(data + r*tw*pixelbytes);
}
}
png_read_image(png, row_pointers);
//.........这里部分代码省略.........
示例7: read_png_file
int read_png_file(const char *file, int32 *pwidth, int32 *pheight, uint8 **image_data_ptr)
{
FILE *infile; /* PNG file pointer */
png_structp png_ptr; /* internally used by libpng */
png_infop info_ptr; /* user requested transforms */
uint8 *image_data; /* raw png image data */
char sig[8]; /* PNG signature array */
/*char **row_pointers; */
int bit_depth;
int color_type;
png_uint_32 width; /* PNG image width in pixels */
png_uint_32 height; /* PNG image height in pixels */
unsigned int rowbytes; /* raw bytes at row n in image */
image_data = NULL;
int i;
png_bytepp row_pointers = NULL;
/* Open the file. */
infile = fopen(file, "rb");
if (!infile) {
return 0;
}
/*
* 13.3 readpng_init()
*/
/* Check for the 8-byte signature */
fread(sig, 1, 8, infile);
if (png_sig_cmp((unsigned char *) sig, 0, 8) != 0) {
fclose(infile);
return 0;
}
/*
* Set up the PNG structs
*/
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
fclose(infile);
return 4; /* out of memory */
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
png_destroy_read_struct(&png_ptr, (png_infopp) NULL, (png_infopp) NULL);
fclose(infile);
return 4; /* out of memory */
}
/*
* block to handle libpng errors,
* then check whether the PNG file had a bKGD chunk
*/
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(infile);
return 0;
}
/*
* takes our file stream pointer (infile) and
* stores it in the png_ptr struct for later use.
*/
/* png_ptr->io_ptr = (png_voidp)infile;*/
png_init_io(png_ptr, infile);
/*
* lets libpng know that we already checked the 8
* signature bytes, so it should not expect to find
* them at the current file pointer location
*/
png_set_sig_bytes(png_ptr, 8);
/* Read the image info.*/
/*
* reads and processes not only the PNG file's IHDR chunk
* but also any other chunks up to the first IDAT
* (i.e., everything before the image data).
*/
/* read all the info up to the image data */
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
&color_type, NULL, NULL, NULL);
*pwidth = width;
*pheight = height;
if (bit_depth > 8) {
//.........这里部分代码省略.........
示例8: save_png_to_file
static int save_png_to_file (bitmap_t *bitmap, const char *path)
{
FILE * fp;
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
size_t x, y;
png_byte ** row_pointers = NULL;
/* "status" contains the return value of this function. At first
it is set to a value which means 'failure'. When the routine
has finished its work, it is set to a value which means
'success'. */
int status = -1;
/* The following number is set by trial and error only. I cannot
see where it it is documented in the libpng manual.
*/
int pixel_size = 3;
int depth = 8;
fp = fopen (path, "wb");
if (! fp) {
goto fopen_failed;
}
png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
goto png_create_write_struct_failed;
}
info_ptr = png_create_info_struct (png_ptr);
if (info_ptr == NULL) {
goto png_create_info_struct_failed;
}
/* Set up error handling. */
if (setjmp (png_jmpbuf (png_ptr))) {
goto png_failure;
}
/* Set image attributes. */
png_set_IHDR (png_ptr,
info_ptr,
bitmap->width,
bitmap->height,
depth,
PNG_COLOR_TYPE_RGB,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT);
/* Initialize rows of PNG. */
row_pointers = png_malloc (png_ptr, bitmap->height * sizeof (png_byte *));
for (y = 0; y < bitmap->height; ++y) {
png_byte *row =
png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * pixel_size);
row_pointers[y] = row;
for (x = 0; x < bitmap->width; ++x) {
pixel_t * pixel = pixel_at (bitmap, x, y);
*row++ = pixel->red;
*row++ = pixel->green;
*row++ = pixel->blue;
}
}
/* Write the image data to "fp". */
png_init_io (png_ptr, fp);
png_set_rows (png_ptr, info_ptr, row_pointers);
png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
/* The routine has successfully written the file, so we set
"status" to a value which indicates success. */
status = 0;
for (y = 0; y < bitmap->height; y++) {
png_free (png_ptr, row_pointers[y]);
}
png_free (png_ptr, row_pointers);
png_failure:
png_create_info_struct_failed:
png_destroy_write_struct (&png_ptr, &info_ptr);
png_create_write_struct_failed:
fclose (fp);
fopen_failed:
return status;
}
示例9: gst_pngenc_handle_frame
static GstFlowReturn
gst_pngenc_handle_frame (GstVideoEncoder * encoder, GstVideoCodecFrame * frame)
{
GstPngEnc *pngenc;
gint row_index;
png_byte **row_pointers;
GstFlowReturn ret = GST_FLOW_OK;
GstVideoInfo *info;
GstVideoFrame vframe;
pngenc = GST_PNGENC (encoder);
info = &pngenc->input_state->info;
GST_DEBUG_OBJECT (pngenc, "BEGINNING");
/* initialize png struct stuff */
pngenc->png_struct_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING,
(png_voidp) NULL, user_error_fn, user_warning_fn);
if (pngenc->png_struct_ptr == NULL)
goto struct_init_fail;
pngenc->png_info_ptr = png_create_info_struct (pngenc->png_struct_ptr);
if (!pngenc->png_info_ptr)
goto png_info_fail;
/* non-0 return is from a longjmp inside of libpng */
if (setjmp (png_jmpbuf (pngenc->png_struct_ptr)) != 0)
goto longjmp_fail;
png_set_filter (pngenc->png_struct_ptr, 0,
PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE);
png_set_compression_level (pngenc->png_struct_ptr, pngenc->compression_level);
png_set_IHDR (pngenc->png_struct_ptr,
pngenc->png_info_ptr,
GST_VIDEO_INFO_WIDTH (info),
GST_VIDEO_INFO_HEIGHT (info),
pngenc->depth,
pngenc->png_color_type,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_set_write_fn (pngenc->png_struct_ptr, pngenc,
(png_rw_ptr) user_write_data, user_flush_data);
row_pointers = g_new (png_byte *, GST_VIDEO_INFO_HEIGHT (info));
if (!gst_video_frame_map (&vframe, &pngenc->input_state->info,
frame->input_buffer, GST_MAP_READ)) {
GST_ELEMENT_ERROR (pngenc, STREAM, FORMAT, (NULL),
("Failed to map video frame, caps problem?"));
ret = GST_FLOW_ERROR;
goto done;
}
for (row_index = 0; row_index < GST_VIDEO_INFO_HEIGHT (info); row_index++) {
row_pointers[row_index] = GST_VIDEO_FRAME_COMP_DATA (&vframe, 0) +
(row_index * GST_VIDEO_FRAME_COMP_STRIDE (&vframe, 0));
}
/* allocate the output buffer */
pngenc->buffer_out = gst_buffer_new ();
png_write_info (pngenc->png_struct_ptr, pngenc->png_info_ptr);
png_write_image (pngenc->png_struct_ptr, row_pointers);
png_write_end (pngenc->png_struct_ptr, NULL);
g_free (row_pointers);
gst_video_frame_unmap (&vframe);
png_destroy_info_struct (pngenc->png_struct_ptr, &pngenc->png_info_ptr);
png_destroy_write_struct (&pngenc->png_struct_ptr, (png_infopp) NULL);
/* Set final size and store */
frame->output_buffer = pngenc->buffer_out;
pngenc->buffer_out = NULL;
if ((ret = gst_video_encoder_finish_frame (encoder, frame)) != GST_FLOW_OK)
goto done;
if (pngenc->snapshot)
ret = GST_FLOW_EOS;
done:
GST_DEBUG_OBJECT (pngenc, "END, ret:%d", ret);
return ret;
/* ERRORS */
struct_init_fail:
{
GST_ELEMENT_ERROR (pngenc, LIBRARY, INIT, (NULL),
("Failed to initialize png structure"));
return GST_FLOW_ERROR;
}
png_info_fail:
{
png_destroy_write_struct (&(pngenc->png_struct_ptr), (png_infopp) NULL);
GST_ELEMENT_ERROR (pngenc, LIBRARY, INIT, (NULL),
//.........这里部分代码省略.........
示例10: _mapcache_imageio_png_decode_to_image
void _mapcache_imageio_png_decode_to_image(mapcache_context *ctx, mapcache_buffer *buffer,
mapcache_image *img) {
int bit_depth,color_type,i;
unsigned char **row_pointers;
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
_mapcache_buffer_closure b;
b.buffer = buffer;
b.ptr = buffer->buf;
png_uint_32 width, height;
/* could pass pointers to user-defined error handlers instead of NULLs: */
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
ctx->set_error(ctx, 500, "failed to allocate png_struct structure");
return;
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
{
png_destroy_read_struct(&png_ptr, NULL, NULL);
ctx->set_error(ctx, 500, "failed to allocate png_info structure");
return;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
ctx->set_error(ctx, 500, "failed to setjmp(png_jmpbuf(png_ptr))");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return;
}
png_set_read_fn(png_ptr,&b,_mapcache_imageio_png_read_func);
png_read_info(png_ptr,info_ptr);
if(!png_get_IHDR(png_ptr, info_ptr, &width, &height,&bit_depth, &color_type,NULL,NULL,NULL)) {
ctx->set_error(ctx, 500, "failed to read png header");
return;
}
img->w = width;
img->h = height;
if(!img->data) {
img->data = calloc(1,img->w*img->h*4*sizeof(unsigned char));
apr_pool_cleanup_register(ctx->pool, img->data, (void*)free, apr_pool_cleanup_null) ;
img->stride = img->w * 4;
}
row_pointers = apr_pcalloc(ctx->pool,img->h * sizeof(unsigned char*));
unsigned char *rowptr = img->data;
for(i=0;i<img->h;i++) {
row_pointers[i] = rowptr;
rowptr += img->stride;
}
png_set_expand(png_ptr);
png_set_strip_16(png_ptr);
png_set_gray_to_rgb(png_ptr);
png_set_add_alpha(png_ptr, 0xff, PNG_FILLER_AFTER);
png_read_update_info(png_ptr, info_ptr);
png_read_image(png_ptr, row_pointers);
png_read_end(png_ptr,NULL);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
}
示例11: PNG_READ_IMAGE
pointer PNG_READ_IMAGE(register context *ctx, int n, register pointer *argv)
{
char *file_name;
pointer ret, image_ptr;
ckarg(1);
if (isstring(argv[0])) file_name = argv[0]->c.str.chars;
else error(E_NOSTRING);
FILE *fp = fopen(file_name, "rb");
if (!fp) {
error(E_OPENFILE);
return(NIL);
}
png_structp png_ptr;
png_infop info_ptr;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
info_ptr = png_create_info_struct(png_ptr);
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
fclose(fp);
error(E_EOF);
return(NIL);
}
png_init_io(png_ptr, fp);
png_read_info(png_ptr, info_ptr);
int width = png_get_image_width(png_ptr, info_ptr);
int height = png_get_image_height(png_ptr, info_ptr);
int bit_depth = png_get_bit_depth(png_ptr, info_ptr);
int channels = png_get_channels(png_ptr, info_ptr);
int color_type = png_get_color_type(png_ptr, info_ptr);
//fprintf(stderr, "bit_depth = %d, channels %d, color_type =%d (pal:%d,gray:%d,rgb:%d,rgba:%d)\n", bit_depth, channels, color_type, PNG_COLOR_TYPE_PALETTE,PNG_COLOR_TYPE_GRAY,PNG_COLOR_TYPE_RGB,PNG_COLOR_TYPE_RGB_ALPHA);
switch (color_type) {
case PNG_COLOR_TYPE_PALETTE:
png_set_palette_to_rgb(png_ptr);
break;
case PNG_COLOR_TYPE_GRAY:
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
if ( bit_depth < 8) png_set_gray_to_rgb(png_ptr);
#else
if ( bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr);
#endif
break;
case PNG_COLOR_TYPE_RGB:
//png_set_bgr(png_ptr);
if (bit_depth == 16) png_set_strip_16(png_ptr); // 16bit -> 8bit
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
if (bit_depth == 16) png_set_strip_16(png_ptr); // 16bit -> 8bit
png_set_invert_alpha(png_ptr);
//png_set_bgr(png_ptr);
//png_set_strip_alpha(png_ptr);
// RGBA -> rgb , GA -> g
png_color_16 my_background = {0xff, 0xff, 0xff, 0xff, 0xff};
png_set_background(png_ptr, &my_background,
PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
break;
}
png_read_update_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);
png_bytep * row_pointers = (png_bytep *)malloc(height*sizeof(png_bytep));
int y, byte_per_scanline = png_get_rowbytes(png_ptr, info_ptr);
image_ptr = makebuffer(height*byte_per_scanline);
for(y=0;y<height;y++){
row_pointers[y] = image_ptr->c.str.chars+y*byte_per_scanline;
}
png_read_image(png_ptr, row_pointers);
free(row_pointers);
png_read_end(png_ptr,info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
fclose(fp);
ret=cons(ctx,image_ptr,NIL);
ret=cons(ctx,makeint(channels),ret);
ret=cons(ctx,makeint(height),ret);
ret=cons(ctx,makeint(width),ret);
return (ret);
}
示例12: qrwrap_writePNG
static int qrwrap_writePNG(const char *outfile, QRcode *qrcode)
{
static FILE *fp;
png_structp png_ptr;
png_infop info_ptr;
unsigned char *row, *p, *q;
int x, y, xx, yy, bit;
int realwidth;
const int margin = 0;
const int size = 8;
const int width = qrcode->width;
realwidth = (width + margin * 2) * size;
row = (unsigned char *)vj_malloc((realwidth + 7) / 8);
if(row == NULL) {
return 0;
}
fp = fopen(outfile, "wb");
if(fp == NULL) {
veejay_msg(VEEJAY_MSG_ERROR, "Unable to write QR code to file:%s", outfile);
return 0;
}
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(png_ptr == NULL) {
fclose(fp);
return 0;
}
info_ptr = png_create_info_struct(png_ptr);
if(info_ptr == NULL) {
fclose(fp);
return 0;
}
if(setjmp(png_jmpbuf(png_ptr))) {
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return 0;
}
png_init_io(png_ptr, fp);
png_set_IHDR(png_ptr, info_ptr,
realwidth, realwidth,
1,
PNG_COLOR_TYPE_GRAY,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT);
png_write_info(png_ptr, info_ptr);
/* top margin */
veejay_memset(row, 0xff, (realwidth + 7) / 8);
for(y=0; y<margin * size; y++) {
png_write_row(png_ptr, row);
}
/* data */
p = qrcode->data;
for(y=0; y<width; y++) {
bit = 7;
veejay_memset(row, 0xff, (realwidth + 7) / 8);
q = row;
q += margin * size / 8;
bit = 7 - (margin * size % 8);
for(x=0; x<width; x++) {
for(xx=0; xx<size; xx++) {
*q ^= (*p & 1) << bit;
bit--;
if(bit < 0) {
q++;
bit = 7;
}
}
p++;
}
for(yy=0; yy<size; yy++) {
png_write_row(png_ptr, row);
}
}
/* bottom margin */
veejay_memset(row, 0xff, (realwidth + 7) / 8);
for(y=0; y<margin * size; y++) {
png_write_row(png_ptr, row);
}
png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
free(row);
return 0;
}
示例13: S9xDoScreenshot
bool8 S9xDoScreenshot (int width, int height)
{
Settings.TakeScreenshot = FALSE;
#ifdef HAVE_LIBPNG
FILE *fp;
png_structp png_ptr;
png_infop info_ptr;
png_color_8 sig_bit;
int imgwidth, imgheight;
const char *fname;
fname = S9xGetFilenameInc(".png", SCREENSHOT_DIR);
fp = fopen(fname, "wb");
if (!fp)
{
S9xMessage(S9X_ERROR, 0, "Failed to take screenshot.");
return (FALSE);
}
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr)
{
fclose(fp);
remove(fname);
S9xMessage(S9X_ERROR, 0, "Failed to take screenshot.");
return (FALSE);
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
{
png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
fclose(fp);
remove(fname);
S9xMessage(S9X_ERROR, 0, "Failed to take screenshot.");
return (FALSE);
}
if (setjmp(png_jmpbuf(png_ptr)))
{
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
remove(fname);
S9xMessage(S9X_ERROR, 0, "Failed to take screenshot.");
return (FALSE);
}
imgwidth = width;
imgheight = height;
if (Settings.StretchScreenshots == 1)
{
if (width > SNES_WIDTH && height <= SNES_HEIGHT_EXTENDED)
imgheight = height << 1;
}
else
if (Settings.StretchScreenshots == 2)
{
if (width <= SNES_WIDTH)
imgwidth = width << 1;
if (height <= SNES_HEIGHT_EXTENDED)
imgheight = height << 1;
}
png_init_io(png_ptr, fp);
png_set_IHDR(png_ptr, info_ptr, imgwidth, imgheight, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
sig_bit.red = 5;
sig_bit.green = 5;
sig_bit.blue = 5;
png_set_sBIT(png_ptr, info_ptr, &sig_bit);
png_set_shift(png_ptr, &sig_bit);
png_write_info(png_ptr, info_ptr);
png_set_packing(png_ptr);
png_byte *row_pointer = new png_byte[png_get_rowbytes(png_ptr, info_ptr)];
uint16 *screen = GFX.Screen;
for (int y = 0; y < height; y++, screen += GFX.RealPPL)
{
png_byte *rowpix = row_pointer;
for (int x = 0; x < width; x++)
{
uint32 r, g, b;
DECOMPOSE_PIXEL(screen[x], r, g, b);
*(rowpix++) = r;
*(rowpix++) = g;
*(rowpix++) = b;
if (imgwidth != width)
{
*(rowpix++) = r;
//.........这里部分代码省略.........
示例14: png_read_bitmap
// Loads a PNG image
//
// filename - name of the targa file to load
// image_data - allocated storage for the bitmap
//
// returns - true if succesful, false otherwise
//
int png_read_bitmap(char *real_filename, ubyte *image_data, ubyte *bpp, int dest_size, int cf_type)
{
char filename[MAX_FILENAME_LEN];
png_infop info_ptr;
png_structp png_ptr;
png_bytepp row_pointers;
unsigned int i, len;
png_file = NULL;
strcpy_s( filename, real_filename );
char *p = strchr( filename, '.' );
if ( p ) *p = 0;
strcat_s( filename, ".png" );
png_file = cfopen(filename, "rb", CFILE_NORMAL, cf_type);
if (png_file == NULL)
return PNG_ERROR_READING;
/* 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)
{
mprintf(("png_read_bitmap: png_ptr went wrong\n"));
cfclose(png_file);
return PNG_ERROR_READING;
}
/* Allocate/initialize the memory for image information. REQUIRED. */
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
mprintf(("png_read_bitmap: info_ptr went wrong\n"));
cfclose(png_file);
png_destroy_read_struct(&png_ptr, NULL, NULL);
return PNG_ERROR_READING;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
mprintf(("png_read_bitmap: something went wrong\n"));
/* Free all of the memory associated with the png_ptr and info_ptr */
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
cfclose(png_file);
/* If we get here, we had a problem reading the file */
return PNG_ERROR_READING;
}
png_set_read_fn(png_ptr, &png_file, png_scp_read_data);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_BGR | PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_16, NULL);
len = png_get_rowbytes(png_ptr, info_ptr);
row_pointers = png_get_rows(png_ptr, info_ptr);
if(bpp)
*bpp = (ubyte)(len / png_get_image_width(png_ptr, info_ptr)) << 3;
//copy row data to image
unsigned int height = png_get_image_height(png_ptr, info_ptr);
for (i = 0; i < height; i++) {
memcpy(&image_data[i * len], row_pointers[i], len);
}
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
cfclose(png_file);
return PNG_ERROR_NONE;
}
示例15: IGN_Create_PNG_JPR
bool IGN_Create_PNG_JPR(LPCSTR mapname, long minx, long miny, long maxx, long maxy)
{
char tstring[256];
long bitmap_width = TILE_WIDTH*(maxx-minx)/1000;
long bitmap_size = bitmap_width*TILE_WIDTH;
unsigned char * bitmap_memory = (unsigned char *)malloc(bitmap_size);
CIGNTileDatabase db;
if (bitmap_memory == NULL) {
printf("Couldn't allocate %d bytes of memory\n");
return false;
}
// Create PNG header and write out palette
sprintf(tstring, "%s.png", mapname);
FILE * fp_png = fopen(tstring, "wb");
if (fp_png == NULL) {
printf("Couldn't open %s\n", tstring);
return false;
}
// Create and initialize the png_struct with the desired error handler functions.
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fclose(fp_png);
return false;
}
/* Allocate/initialize the image information data. REQUIRED */
png_infop info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
fclose(fp_png);
return false;
}
/* Set error handling. REQUIRED */
if (setjmp(png_jmpbuf(png_ptr))) {
/* If we get here, we had a problem reading the file */
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp_png);
return false;
}
/* set up the output control if you are using standard C streams */
png_init_io(png_ptr, fp_png);
/* Set the image information here. Width and height are up to 2^31,
* bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on
* the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY,
* PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB,
* or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or
* PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST
* currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. REQUIRED
*/
png_set_IHDR(png_ptr, info_ptr, TILE_WIDTH*(maxx-minx)/1000, TILE_WIDTH*((maxy-miny)/1000), 8, PNG_COLOR_TYPE_PALETTE,
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
/* set the palette if there is one. REQUIRED for indexed-color images */
png_colorp png_palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof (png_color));
int i;
BYTE * pal_ptr = (BYTE *)png_palette;
BYTE * palette = ign_palette;
for (i=0; i<256; i++) {
*pal_ptr++ = palette[i*4 + 2];
*pal_ptr++ = palette[i*4 + 1];
*pal_ptr++ = palette[i*4 + 0];
}
/* ... set palette colors ... */
png_set_PLTE(png_ptr, info_ptr, png_palette, PNG_MAX_PALETTE_LENGTH);
/* You must not free palette here, because png_set_PLTE only makes a link to
* the palette that you malloced. Wait until you are about to destroy
*the png structure. */
/* Write the file header information. REQUIRED */
png_write_info(png_ptr, info_ptr);
CProgressWindow wndProgress;
wndProgress.Initialize();
wndProgress.ResetProgressBar("Tile:", (maxy-miny)/500*(maxx-minx)/500);
for (int y=maxy-1000; y>=miny; y-=1000) {
memset(bitmap_memory, 0x00, bitmap_size);
for (int x=minx; x<maxx; x+=1000) {
IGN_read_bmp(y, x, &db, bitmap_memory+(x-minx)/1000*TILE_WIDTH, bitmap_width);
}
// write row of PNG to file
for (int x=0; x<TILE_WIDTH; x++) {
png_write_row(png_ptr, bitmap_memory + x*bitmap_width);
if (!wndProgress.ProgressBar()) return false;
//.........这里部分代码省略.........