本文整理汇总了C++中png_set_gray_to_rgb函数的典型用法代码示例。如果您正苦于以下问题:C++ png_set_gray_to_rgb函数的具体用法?C++ png_set_gray_to_rgb怎么用?C++ png_set_gray_to_rgb使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了png_set_gray_to_rgb函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: fopen
RImage *RLoadPNG(RContext *context, const char *file)
{
char *tmp;
RImage *image = NULL;
FILE *f;
png_structp png;
png_infop pinfo, einfo;
png_color_16p bkcolor;
int alpha;
int x, y, i;
double gamma, sgamma;
png_uint_32 width, height;
int depth, junk, color_type;
png_bytep *png_rows;
unsigned char *ptr;
f = fopen(file, "rb");
if (!f) {
RErrorCode = RERR_OPEN;
return NULL;
}
png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, (png_error_ptr) NULL, (png_error_ptr) NULL);
if (!png) {
RErrorCode = RERR_NOMEMORY;
fclose(f);
return NULL;
}
pinfo = png_create_info_struct(png);
if (!pinfo) {
RErrorCode = RERR_NOMEMORY;
fclose(f);
png_destroy_read_struct(&png, NULL, NULL);
return NULL;
}
einfo = png_create_info_struct(png);
if (!einfo) {
RErrorCode = RERR_NOMEMORY;
fclose(f);
png_destroy_read_struct(&png, &pinfo, NULL);
return NULL;
}
RErrorCode = RERR_INTERNAL;
#if PNG_LIBPNG_VER - 0 < 10400
if (setjmp(png->jmpbuf)) {
#else
if (setjmp(png_jmpbuf(png))) {
#endif
fclose(f);
png_destroy_read_struct(&png, &pinfo, &einfo);
if (image)
RReleaseImage(image);
return NULL;
}
png_init_io(png, f);
png_read_info(png, pinfo);
png_get_IHDR(png, pinfo, &width, &height, &depth, &color_type, &junk, &junk, &junk);
/* sanity check */
if (width < 1 || height < 1) {
fclose(f);
png_destroy_read_struct(&png, &pinfo, &einfo);
RErrorCode = RERR_BADIMAGEFILE;
return NULL;
}
/* check for an alpha channel */
if (png_get_valid(png, pinfo, PNG_INFO_tRNS))
alpha = True;
else
alpha = (color_type & PNG_COLOR_MASK_ALPHA);
/* allocate RImage */
image = RCreateImage(width, height, alpha);
if (!image) {
fclose(f);
png_destroy_read_struct(&png, &pinfo, &einfo);
return NULL;
}
/* normalize to 8bpp with alpha channel */
if (color_type == PNG_COLOR_TYPE_PALETTE && depth <= 8)
png_set_expand(png);
if (color_type == PNG_COLOR_TYPE_GRAY && depth <= 8)
png_set_expand(png);
if (png_get_valid(png, pinfo, PNG_INFO_tRNS))
png_set_expand(png);
if (depth == 16)
png_set_strip_16(png);
if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png);
//.........这里部分代码省略.........
开发者ID:crmafra,项目名称:wmaker,代码行数:101,代码来源:png.c
示例2: longjmp
void PNGImageDecoder::headerAvailable()
{
png_structp png = m_reader->pngPtr();
png_infop info = m_reader->infoPtr();
png_uint_32 width = png->width;
png_uint_32 height = png->height;
// Protect against large images.
if (png->width > cMaxPNGSize || png->height > cMaxPNGSize) {
longjmp(JMPBUF(png), 1);
return;
}
// We can fill in the size now that the header is available. Avoid memory
// corruption issues by neutering setFailed() during this call; if we don't
// do this, failures will cause |m_reader| to be deleted, and our jmpbuf
// will cease to exist. Note that we'll still properly set the failure flag
// in this case as soon as we longjmp().
m_doNothingOnFailure = true;
bool result = setSize(width, height);
m_doNothingOnFailure = false;
if (!result) {
longjmp(JMPBUF(png), 1);
return;
}
int bitDepth, colorType, interlaceType, compressionType, filterType, channels;
png_get_IHDR(png, info, &width, &height, &bitDepth, &colorType, &interlaceType, &compressionType, &filterType);
if ((colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_RGB_ALPHA) && !m_ignoreGammaAndColorProfile) {
// We currently support color profiles only for RGB and RGBA PNGs. Supporting
// color profiles for gray-scale images is slightly tricky, at least using the
// CoreGraphics ICC library, because we expand gray-scale images to RGB but we
// don't similarly transform the color profile. We'd either need to transform
// the color profile or we'd need to decode into a gray-scale image buffer and
// hand that to CoreGraphics.
m_colorProfile = readColorProfile(png, info);
}
// The options we set here match what Mozilla does.
// Expand to ensure we use 24-bit for RGB and 32-bit for RGBA.
if (colorType == PNG_COLOR_TYPE_PALETTE || (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8))
png_set_expand(png);
png_bytep trns = 0;
int trnsCount = 0;
if (png_get_valid(png, info, PNG_INFO_tRNS)) {
png_get_tRNS(png, info, &trns, &trnsCount, 0);
png_set_expand(png);
}
if (bitDepth == 16)
png_set_strip_16(png);
if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png);
// Deal with gamma and keep it under our control.
double gamma;
if (!m_ignoreGammaAndColorProfile && png_get_gAMA(png, info, &gamma)) {
if ((gamma <= 0.0) || (gamma > cMaxGamma)) {
gamma = cInverseGamma;
png_set_gAMA(png, info, gamma);
}
png_set_gamma(png, cDefaultGamma, gamma);
} else
png_set_gamma(png, cDefaultGamma, cInverseGamma);
// Tell libpng to send us rows for interlaced pngs.
if (interlaceType == PNG_INTERLACE_ADAM7)
png_set_interlace_handling(png);
// Update our info now.
png_read_update_info(png, info);
channels = png_get_channels(png, info);
ASSERT(channels == 3 || channels == 4);
m_reader->setHasAlpha(channels == 4);
if (m_reader->decodingSizeOnly()) {
// If we only needed the size, halt the reader.
m_reader->setReadOffset(m_reader->currentBufferSize() - png->buffer_size);
png->buffer_size = 0;
}
}
开发者ID:achellies,项目名称:WinCEWebKit,代码行数:86,代码来源:PNGImageDecoder.cpp
示例3: png_info_callback
void png_info_callback(png_structp png_ptr, png_infop info_ptr)
{
int bit_depth, color_type, intent;
double gamma;
int bytes_per_pixel=3;
struct cached_image *cimg;
cimg=global_cimg;
bit_depth=png_get_bit_depth(png_ptr, info_ptr);
color_type=png_get_color_type(png_ptr, info_ptr);
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_expand(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY &&
bit_depth < 8) png_set_expand(png_ptr);
if (png_get_valid(png_ptr, info_ptr,
PNG_INFO_tRNS)){
png_set_expand(png_ptr); /* Legacy version of
png_set_tRNS_to_alpha(png_ptr); */
bytes_per_pixel++;
}
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png_ptr);
if (bit_depth==16){
#ifndef REPACK_16
#ifdef C_LITTLE_ENDIAN
/* We use native endianity only if unsigned short is 2-byte
* because otherwise we have to reassemble the buffer so we
* will leave in the libpng-native big endian.
*/
png_set_swap(png_ptr);
#endif /* #ifdef C_LITTLE_ENDIAN */
#endif /* #ifndef REPACK_16 */
bytes_per_pixel*=sizeof(unsigned short);
}
png_set_interlace_handling(png_ptr);
if (color_type==PNG_COLOR_TYPE_RGB_ALPHA
||color_type==PNG_COLOR_TYPE_GRAY_ALPHA){
if (bytes_per_pixel==3
||bytes_per_pixel==3*sizeof(unsigned short))
bytes_per_pixel=4*bytes_per_pixel/3;
}
cimg->width=png_get_image_width(png_ptr,info_ptr);
cimg->height=png_get_image_height(png_ptr,info_ptr);
cimg->buffer_bytes_per_pixel=bytes_per_pixel;
if (png_get_sRGB(png_ptr, info_ptr, &intent)){
gamma=sRGB_gamma;
}
else
{
if (!png_get_gAMA(png_ptr, info_ptr, &gamma)){
gamma=sRGB_gamma;
}
}
cimg->red_gamma=gamma;
cimg->green_gamma=gamma;
cimg->blue_gamma=gamma;
png_read_update_info(png_ptr,info_ptr);
cimg->strip_optimized=0;
header_dimensions_known(cimg);
}
开发者ID:Gingar,项目名称:port,代码行数:62,代码来源:png.c
示例4: int_png_load
int int_png_load(const char *name, unsigned char **buffer, int* xp, int* yp, int* bpp, bool alpha)
{
static const png_color_16 my_background = {0, 0, 0, 0, 0};
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width, height;
unsigned int i;
int bit_depth, color_type, interlace_type, number_passes, pass, int_bpp;
png_byte * fbptr;
FILE * fh;
if(!(fh=fopen(name,"rb")))
return(FH_ERROR_FILE);
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(png_ptr == NULL) {
fclose(fh);
return(FH_ERROR_FORMAT);
}
info_ptr = png_create_info_struct(png_ptr);
if(info_ptr == NULL)
{
png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
fclose(fh);
return(FH_ERROR_FORMAT);
}
#if (PNG_LIBPNG_VER < 10500)
if (setjmp(png_ptr->jmpbuf))
#else
if (setjmp(png_jmpbuf(png_ptr)))
#endif
{
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
fclose(fh);
return(FH_ERROR_FORMAT);
}
png_init_io(png_ptr,fh);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL);
if (alpha)
{
*bpp = png_get_channels(png_ptr, info_ptr);
if ((*bpp != 4) || !(color_type & PNG_COLOR_MASK_ALPHA))
{
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
fclose(fh);
return fh_png_load(name, buffer, xp, yp);
}
// 24bit PNGs with alpha-channel
int_bpp = 4;
// png_set_swap_alpha(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(png_ptr);
}else // All other PNGs
{
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
png_set_palette_to_rgb(png_ptr);
png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
/* other possibility for png_set_background: use png_get_bKGD */
}
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
{
png_set_gray_to_rgb(png_ptr);
png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
}
/* this test does not trigger for 8bit-paletted PNGs with newer libpng (1.2.36 at least),
but the data delivered is with alpha channel anyway, so always strip alpha for now
*/
#if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR <= 2 && PNG_LIBPNG_VER_RELEASE < 36
if (color_type & PNG_COLOR_MASK_ALPHA)
#endif
png_set_strip_alpha(png_ptr);
if (bit_depth < 8)
png_set_packing(png_ptr);
int_bpp = 3;
}
if (bit_depth == 16)
png_set_strip_16(png_ptr);
number_passes = png_set_interlace_handling(png_ptr);
png_read_update_info(png_ptr,info_ptr);
unsigned long rowbytes = png_get_rowbytes(png_ptr, info_ptr);
if (width * int_bpp != rowbytes)
{
printf("[png.cpp]: Error processing %s - please report (including image).\n", name);
printf(" width: %lu rowbytes: %lu\n", (unsigned long)width, (unsigned long)rowbytes);
fclose(fh);
return(FH_ERROR_FORMAT);
}
for (pass = 0; pass < number_passes; pass++)
{
fbptr = (png_byte *)(*buffer);
for (i = 0; i < height; i++, fbptr += width * int_bpp)
png_read_row(png_ptr, fbptr, NULL);
}
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
fclose(fh);
return(FH_ERROR_OK);
}
开发者ID:FFTEAM,项目名称:neutrino-mp-cst-next,代码行数:100,代码来源:png.cpp
示例5: readPng
//.........这里部分代码省略.........
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)
png_set_packing (png);
/* convert grayscale to RGB */
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb (png);
if (interlace != PNG_INTERLACE_NONE)
png_set_interlace_handling (png);
png_set_bgr (png);
png_set_filler (png, 0xff, PNG_FILLER_AFTER);
png_set_read_user_transform_fn (png, premultiplyData);
png_read_update_info (png, info);
pixel_size = 4;
*data = (char *) malloc (png_width * png_height * pixel_size);
if (*data == NULL)
{
fclose (file);
return FALSE;
}
row_pointers = (png_byte **) malloc (png_height * sizeof (char *));
for (i=0; i < png_height; i++)
row_pointers[i] = (png_byte *) (*data + i * png_width * pixel_size);
png_read_image (png, row_pointers);
png_read_end (png, info);
free (row_pointers);
fclose (file);
png_destroy_read_struct (&png, &info, NULL);
return TRUE;
}
开发者ID:freedesktop-unofficial-mirror,项目名称:xorg__app__glxcompmgr,代码行数:101,代码来源:readpng.c
示例6: png_create_read_struct
bool SkPNGImageDecoder::onDecodeInit(SkStream* sk_stream,
png_structp *png_ptrp, png_infop *info_ptrp)
{
/* 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. */
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL, sk_error_fn, NULL);
// png_voidp user_error_ptr, user_error_fn, user_warning_fn);
if (png_ptr == NULL) {
return false;
}
*png_ptrp = png_ptr;
/* Allocate/initialize the memory for image information. */
png_infop info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return false;
}
*info_ptrp = info_ptr;
/* 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))) {
return false;
}
/* If you are using replacement read functions, instead of calling
* png_init_io() here you would call:
*/
png_set_read_fn(png_ptr, (void *)sk_stream, sk_read_fn);
png_set_seek_fn(png_ptr, sk_seek_fn);
/* where user_io_ptr is a structure you want available to the callbacks */
/* If we have already read some of the signature */
// png_set_sig_bytes(png_ptr, 0 /* sig_read */ );
// hookup our peeker so we can see any user-chunks the caller may be interested in
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_ALWAYS, (png_byte*)"", 0);
if (this->getPeeker()) {
png_set_read_user_chunk_fn(png_ptr, (png_voidp)this->getPeeker(), sk_read_user_chunk);
}
/* The call to png_read_info() gives us all of the information from the
* PNG file before the first IDAT (image data chunk). */
png_read_info(png_ptr, info_ptr);
png_uint_32 origWidth, origHeight;
int bit_depth, color_type, interlace_type;
png_get_IHDR(png_ptr, info_ptr, &origWidth, &origHeight, &bit_depth,
&color_type, &interlace_type, int_p_NULL, int_p_NULL);
/* tell libpng to strip 16 bit/color files down to 8 bits/color */
if (bit_depth == 16) {
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). */
if (bit_depth < 8) {
png_set_packing(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);
}
/* Make a grayscale image into RGB. */
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(png_ptr);
}
return true;
}
开发者ID:ModADroid,项目名称:platform_external_skia,代码行数:76,代码来源:SkImageDecoder_libpng.cpp
示例7: malloc
void Image::LoadPNG(FILE *f, char *filename, Texture *tex) {
png_structp png;
png_infop pnginfo;
byte ioBuffer[8192];
byte *raw;
int filesize = SystemFileManager::FileLength(f);
raw = (byte *) malloc(filesize + 1);
if (raw == NULL) {
Sys_Error("Out of memory to load PNG: %s\n", filename);
return;
}
fread(raw, 1, filesize, f);
fclose(f);
if (!raw) {
Con_Printf("Bad png file %s\n", filename);
return;
}
if (png_sig_cmp(raw, 0, 4)) {
free(raw);
return;
}
png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
if (!png) {
free(raw);
return;
}
pnginfo = png_create_info_struct(png);
if (!pnginfo) {
free(raw);
png_destroy_read_struct(&png, &pnginfo, 0);
return;
}
png_set_sig_bytes(png, 0/*sizeof( sig )*/);
mypng_struct_create(); // creates the my_png struct
my_png->tmpBuf = (char *) raw; //buf = whole file content
my_png->tmpi = 0;
png_set_read_fn(png, ioBuffer, fReadData);
png_read_info(png, pnginfo);
png_get_IHDR(png, pnginfo, &my_png->Width, &my_png->Height, &my_png->BitDepth, &my_png->ColorType, &my_png->Interlace, &my_png->Compression, &my_png->Filter);
// ...removed bgColor code here...
if (my_png->ColorType == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png);
if (my_png->ColorType == PNG_COLOR_TYPE_GRAY && my_png->BitDepth < 8)
png_set_expand_gray_1_2_4_to_8(png);
// Add alpha channel if present
if (png_get_valid(png, pnginfo, PNG_INFO_tRNS))
png_set_tRNS_to_alpha(png);
// hax: expand 24bit to 32bit
if (my_png->BitDepth == 8 && my_png->ColorType == PNG_COLOR_TYPE_RGB)
png_set_filler(png, 255, PNG_FILLER_AFTER);
if ((my_png->ColorType == PNG_COLOR_TYPE_GRAY) || (my_png->ColorType == PNG_COLOR_TYPE_GRAY_ALPHA)) {
png_set_gray_to_rgb(png);
png_set_add_alpha(png, 255, PNG_FILLER_AFTER);
}
if (my_png->BitDepth < 8)
png_set_expand(png);
// update the info structure
png_read_update_info(png, pnginfo);
my_png->FRowBytes = png_get_rowbytes(png, pnginfo);
my_png->BytesPerPixel = png_get_channels(png, pnginfo); // DL Added 30/08/2000
InitializeDemData();
if ((my_png->Data) && (my_png->FRowPtrs))
png_read_image(png, (png_bytepp) my_png->FRowPtrs);
png_read_end(png, pnginfo); // read last information chunks
png_destroy_read_struct(&png, &pnginfo, 0);
if (my_png->BitDepth == 8) {
tex->width = my_png->Width;
tex->height = my_png->Height;
tex->bytesPerPixel = my_png->BytesPerPixel;
tex->setData((byte *) my_png->Data);
} else {
Con_Printf("Bad png color depth: %s\n", filename);
free(my_png->Data);
}
free(raw);
//.........这里部分代码省略.........
开发者ID:DrLabman,项目名称:QMB,代码行数:101,代码来源:ImagePNG.cpp
示例8: reader
void PNGImageDecoder::headerAvailable()
{
png_structp png = reader()->pngPtr();
png_infop info = reader()->infoPtr();
png_uint_32 width = png->width;
png_uint_32 height = png->height;
// Protect against large images.
if (png->width > cMaxPNGSize || png->height > cMaxPNGSize) {
m_failed = true;
longjmp(png->jmpbuf, 1);
return;
}
// We can fill in the size now that the header is available.
if (!m_sizeAvailable) {
m_sizeAvailable = true;
m_size = IntSize(width, height);
}
int bitDepth, colorType, interlaceType, compressionType, filterType, channels;
png_get_IHDR(png, info, &width, &height, &bitDepth, &colorType,
&interlaceType, &compressionType, &filterType);
// The options we set here match what Mozilla does.
// Expand to ensure we use 24-bit for RGB and 32-bit for RGBA.
if (colorType == PNG_COLOR_TYPE_PALETTE ||
(colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8))
png_set_expand(png);
png_bytep trns = 0;
int trnsCount = 0;
if (png_get_valid(png, info, PNG_INFO_tRNS)) {
png_get_tRNS(png, info, &trns, &trnsCount, 0);
png_set_expand(png);
}
if (bitDepth == 16)
png_set_strip_16(png);
if (colorType == PNG_COLOR_TYPE_GRAY ||
colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png);
// Deal with gamma and keep it under our control.
double gamma;
if (png_get_gAMA(png, info, &gamma)) {
if ((gamma <= 0.0) || (gamma > cMaxGamma)) {
gamma = cInverseGamma;
png_set_gAMA(png, info, gamma);
}
png_set_gamma(png, cDefaultGamma, gamma);
}
else
png_set_gamma(png, cDefaultGamma, cInverseGamma);
// Tell libpng to send us rows for interlaced pngs.
if (interlaceType == PNG_INTERLACE_ADAM7)
png_set_interlace_handling(png);
// Update our info now
png_read_update_info(png, info);
channels = png_get_channels(png, info);
assert(channels == 3 || channels == 4);
reader()->setHasAlpha(channels == 4);
if (reader()->decodingSizeOnly()) {
// If we only needed the size, halt the reader.
reader()->setReadOffset(m_data->size() - png->buffer_size);
png->buffer_size = 0;
}
}
开发者ID:jackiekaon,项目名称:owb-mirror,代码行数:74,代码来源:BCPNGImageDecoderWK.cpp
示例9: SplashDecodePng
int
SplashDecodePng(Splash * splash, png_rw_ptr read_func, void *io_ptr)
{
int stride;
ImageFormat srcFormat;
png_uint_32 i, rowbytes;
png_bytepp row_pointers = NULL;
png_bytep image_data = NULL;
int success = 0;
double gamma;
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
png_uint_32 width, height;
int bit_depth, color_type;
ImageRect srcRect, dstRect;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
goto done;
}
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
goto done;
}
if (setjmp(png_ptr->jmpbuf)) {
goto done;
}
png_ptr->io_ptr = io_ptr;
png_ptr->read_data_fn = read_func;
png_set_sig_bytes(png_ptr, SIG_BYTES); /* we already read the 8 signature bytes */
png_read_info(png_ptr, info_ptr); /* read all PNG info up to image data */
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
NULL, NULL, NULL);
/* expand palette images to RGB, low-bit-depth grayscale images to 8 bits,
* transparency chunks to full alpha channel; strip 16-bit-per-sample
* images to 8 bits per sample; and convert grayscale to RGB[A]
* this may be sub-optimal but this simplifies implementation */
png_set_expand(png_ptr);
png_set_tRNS_to_alpha(png_ptr);
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
png_set_strip_16(png_ptr);
png_set_gray_to_rgb(png_ptr);
if (png_get_gAMA(png_ptr, info_ptr, &gamma))
png_set_gamma(png_ptr, 2.2, gamma);
png_read_update_info(png_ptr, info_ptr);
rowbytes = png_get_rowbytes(png_ptr, info_ptr);
if (!SAFE_TO_ALLOC(rowbytes, height)) {
goto done;
}
if ((image_data = (unsigned char *) malloc(rowbytes * height)) == NULL) {
goto done;
}
if (!SAFE_TO_ALLOC(height, sizeof(png_bytep))) {
goto done;
}
if ((row_pointers = (png_bytepp) malloc(height * sizeof(png_bytep)))
== NULL) {
goto done;
}
for (i = 0; i < height; ++i)
row_pointers[i] = image_data + i * rowbytes;
png_read_image(png_ptr, row_pointers);
SplashCleanup(splash);
splash->width = width;
splash->height = height;
if (!SAFE_TO_ALLOC(splash->width, splash->imageFormat.depthBytes)) {
goto done;
}
stride = splash->width * splash->imageFormat.depthBytes;
if (!SAFE_TO_ALLOC(splash->height, stride)) {
goto done;
}
splash->frameCount = 1;
splash->frames = (SplashImage *)
malloc(sizeof(SplashImage) * splash->frameCount);
if (splash->frames == NULL) {
//.........这里部分代码省略.........
开发者ID:AllenWeb,项目名称:openjdk-1,代码行数:101,代码来源:splashscreen_png.c
示例10: png_load_img
int png_load_img(img I) {
unsigned char **p, **q;
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width, height;
int i, j, bit_depth, color_type, interlace_type;
png_bytepp row_pointers;
img_alloc(I);
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
if (png_ptr == NULL) {
I->err = IE_HDRFORMAT;
return 0;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
I->err = IE_HDRFORMAT;
return 0;
}
rewind(I->fp);
png_init_io(png_ptr, I->fp);
png_read_info(png_ptr, info_ptr);
/* Get image specific data */
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
&interlace_type, NULL, NULL);
/* Convert greyscale images to 8-bit RGB */
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
if (bit_depth < 8) {
png_set_expand_gray_1_2_4_to_8(png_ptr);
}
png_set_gray_to_rgb(png_ptr);
}
/* Change paletted images to RGB */
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_expand(png_ptr);
if (bit_depth < 8)
png_set_expand(png_ptr);
if (bit_depth == 16)
png_set_strip_16(png_ptr);
/* The gdk img widget appears to expect 8-bit RGB followed by a
* filler byte. */
png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
/* Update the info structure after the transforms */
png_read_update_info(png_ptr, info_ptr);
/* png_set_rows(png_ptr, info_ptr, row_pointers)*/
/* Allocate space before reading the image */
row_pointers = png_malloc(png_ptr, height * sizeof(png_bytep));
for (i = 0; i < height; i++) {
row_pointers[i] = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
}
/* Read in the image and copy it to the gdk img structure */
png_read_image(png_ptr, row_pointers);
p = (unsigned char **)I->data;
q = (unsigned char **)row_pointers;
for (i = 0; i < height; i++) {
for (j = 0; j < png_get_rowbytes(png_ptr, info_ptr); j++) {
p[i][j] = q[i][j];
}
}
png_read_end(png_ptr, info_ptr);
/* Clean up */
png_free(png_ptr, row_pointers);
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
return 1;
}
开发者ID:cfinucane,项目名称:driftnet,代码行数:88,代码来源:png.c
示例11: _png_get_hdr
static int _png_get_hdr( wprint_image_info_t *image_info )
{
unsigned char header[8];
memset(header, 0,sizeof(header));
int bit_depth, pixel_depth, number_of_passes;
image_info->decoder_data.png_info.png_ptr = NULL;
image_info->decoder_data.png_info.info_ptr = NULL;
fseek(image_info->imgfile, 0, SEEK_SET);
int header_size = fread(header, 1, sizeof(header), image_info->imgfile);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): header_size: %d", header_size);
int pngsig = png_sig_cmp(header, 0, sizeof(header));
if (pngsig)
{
image_info->wprint_ifc->debug(DBG_ERROR, "_png_get_hdr(): ERROR: not a PNG file");
return(ERROR);
}
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): png_sig_cmp() returned %d", pngsig);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): PNG_LIBPNG_VER_STRING: %s", PNG_LIBPNG_VER_STRING);
/* initialize stuff */
image_info->decoder_data.png_info.png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): png_create_read_struct() returned %d", image_info->decoder_data.png_info.png_ptr);
if (!(image_info->decoder_data.png_info.png_ptr))
{
image_info->wprint_ifc->debug(DBG_ERROR, "_png_get_hdr(): ERROR: png_create_read_struct failed");
return(ERROR);
}
image_info->decoder_data.png_info.info_ptr = png_create_info_struct(image_info->decoder_data.png_info.png_ptr);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): png_create_info_struct() returned %d", image_info->decoder_data.png_info.info_ptr);
if (!(image_info->decoder_data.png_info.info_ptr))
{
image_info->wprint_ifc->debug(DBG_ERROR, "_png_get_hdr(): ERROR: png_create_info_struct failed");
return(ERROR);
}
if (setjmp(png_jmpbuf(image_info->decoder_data.png_info.png_ptr)))
{
image_info->wprint_ifc->debug(DBG_ERROR, "_png_get_hdr(): ERROR: invalid or corrupt PNG");
return(ERROR);
}
png_init_io(image_info->decoder_data.png_info.png_ptr, image_info->imgfile);
png_set_sig_bytes(image_info->decoder_data.png_info.png_ptr, sizeof(header));
png_read_info(image_info->decoder_data.png_info.png_ptr, image_info->decoder_data.png_info.info_ptr);
number_of_passes = png_set_interlace_handling(image_info->decoder_data.png_info.png_ptr);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): png_set_interlace_handling() returned %d", number_of_passes);
// setup background color as white
png_color_16 bg_color;
bg_color.index = 0;
bg_color.red = (png_uint_16)-1;
bg_color.green = (png_uint_16)-1;
bg_color.blue = (png_uint_16)-1;
bg_color.gray = (png_uint_16)-1;
// blend alpha using white background color instead of stripping alpha channel
png_set_background(image_info->decoder_data.png_info.png_ptr, &bg_color, PNG_BACKGROUND_GAMMA_FILE, 0, 1.0);
// png_set_strip_alpha(image_info->decoder_data.png_info.png_ptr);
png_set_expand(image_info->decoder_data.png_info.png_ptr);
png_set_strip_16(image_info->decoder_data.png_info.png_ptr);
png_set_gray_to_rgb(image_info->decoder_data.png_info.png_ptr);
png_read_update_info(image_info->decoder_data.png_info.png_ptr, image_info->decoder_data.png_info.info_ptr);
image_info->width = png_get_image_width(image_info->decoder_data.png_info.png_ptr,
image_info->decoder_data.png_info.info_ptr);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): png_get_image_width() returned %d", image_info->width);
image_info->height = png_get_image_height(image_info->decoder_data.png_info.png_ptr,
image_info->decoder_data.png_info.info_ptr);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): png_get_image_height() returned %d", image_info->height);
bit_depth = png_get_bit_depth(image_info->decoder_data.png_info.png_ptr,
image_info->decoder_data.png_info.info_ptr);
image_info->wprint_ifc->debug(DBG_VERBOSE, "_png_get_hdr(): png_get_bit_depth() returned %d", bit_depth);
pixel_depth = image_info->decoder_data.png_info.info_ptr->pixel_depth;
if ( (bit_depth == BITS_PER_CHANNEL) && (pixel_depth == BITS_PER_PIXEL) )
{
image_info->num_components = pixel_depth/bit_depth;
image_info->wprint_ifc->debug(DBG_LOG, "_png_get_hdr(): PNG %d x %d (%d components)",
image_info->width, image_info->height,
image_info->num_components);
return(OK);
}
else
{
image_info->wprint_ifc->debug(DBG_ERROR, "_png_get_hdr(): ERROR: PNG format not supported. pix = %d, bit = %d",
pixel_depth, bit_depth);
return(ERROR);
}
} /* static wprint_png_get_hdr */
开发者ID:ibevilinc,项目名称:WFDSPrintPlugin,代码行数:96,代码来源:wprint_png.c
示例12: png_create_read_struct
bool Image::load (const std::string &s)
{
//
// The following is based on the libpng manual. http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.1
//
//
// Check the file header
//
// Open the file
std::ifstream infile;
infile.open(s.c_str(), std::ifstream::in | std::ifstream::binary);
// Read the header
const unsigned int NUM_HEADER_BYTES_TO_READ = 8;
char header[NUM_HEADER_BYTES_TO_READ];
infile.read(header, NUM_HEADER_BYTES_TO_READ);
if (png_sig_cmp((png_bytep) header, 0, NUM_HEADER_BYTES_TO_READ)) {
return false;
}
//
// Read the image data
//
png_bytep *row_pointers = NULL;
// 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_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
return false;
}
// Allocate/initialize the memory for image information
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);
return false;
}
// 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))) {
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
delete row_pointers; // Gets allocated after here, but don't forget the jump!
return false;
}
// Set custom read routine
png_set_read_fn(png_ptr, &infile, &png_read_data);
// If we have already read some of the signature
png_set_sig_bytes(png_ptr, NUM_HEADER_BYTES_TO_READ);
//
// Read the entire image
//
// Read PNG header info
png_read_info(png_ptr, info_ptr);
int bit_depth, color_type, interlace_type;
// Header info
png_uint_32 width,height;
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL);
// Strip 16 bit down to 8 bit
png_set_strip_16(png_ptr);
// Extract components to even bytes
png_set_packing(png_ptr);
// Expand grayscale images to 8 bit
png_set_expand(png_ptr);
// Add a filler byte when missing
png_set_filler(png_ptr,0xFFFFFFFF,PNG_FILLER_AFTER);
// Expand grayscale images to rgb
png_set_gray_to_rgb(png_ptr);
// Update the transformation info within libpng
png_read_update_info(png_ptr, info_ptr);
// Header info again
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL);
// Allocate target image
allocate(width, height);
// Handle Gamma
//.........这里部分代码省略.........
开发者ID:9heart,项目名称:DT3,代码行数:101,代码来源:Image.cpp
示例13: ReadPNG
//.........这里部分代码省略.........
/* extract the data we need to form the HBITMAP from the PNG header */
png_get_IHDR(png_ptr, info_ptr, &Width, &Height, &bit_depth, &color_type,
&interlace_type, &compression_type, &filter_type );
img->width = (unsigned int) Width;
img->height = (unsigned int) Height;
img->bits_per_pixel = (unsigned char)32;
img->scan_width = Width * 4;
/* strip if color channel is larger than 8 bits */
if (bit_depth > 8)
{
png_set_strip_16(png_ptr);
bit_depth = 8;
}
/* These are not really required per Rice format spec,
* but is done just in case someone uses them.
* convert palette color to rgb color */
if (color_type == PNG_COLOR_TYPE_PALETTE) {
png_set_palette_to_rgb(png_ptr);
color_type = PNG_COLOR_TYPE_RGB;
}
/* expand 1,2,4 bit gray scale to 8 bit gray scale */
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_expand_gray_1_2_4_to_8(png_ptr);
/* convert gray scale or gray scale + alpha to rgb color */
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(png_ptr);
color_type = PNG_COLOR_TYPE_RGB;
}
/* add alpha channel if any */
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
png_set_tRNS_to_alpha(png_ptr);
color_type = PNG_COLOR_TYPE_RGB_ALPHA;
}
/* convert rgb to rgba */
if (color_type == PNG_COLOR_TYPE_RGB) {
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
color_type = PNG_COLOR_TYPE_RGB_ALPHA;
}
/* punt invalid formats */
if (color_type != PNG_COLOR_TYPE_RGB_ALPHA) {
longjmp(err_jmp, (int)errIncorrectFormat);
}
/* convert rgba to bgra */
png_set_bgr(png_ptr);
img->palette_size = (unsigned short)0;
img->bytes_per_palette_entry = 4U;
tmp = AllocateBMGImage( img );
if ( tmp != BMG_OK )
longjmp( err_jmp, (int)tmp );
/* Update info structure */
png_read_update_info( png_ptr, info_ptr );
开发者ID:death-droid,项目名称:Rice-Video,代码行数:67,代码来源:pngrw.c
示例14: png2pnm
BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL alpha)
{
png_struct *png_ptr = NULL;
png_info *info_ptr = NULL;
png_byte buf[8];
png_byte *png_pixels = NULL;
png_byte **row_pointers = NULL;
png_byte *pix_ptr = NULL;
png_uint_32 row_bytes;
png_uint_32 width;
png_uint_32 height;
int bit_depth;
int channels;
int color_type;
int alpha_present;
int row, col;
int ret;
int i;
long dep_16;
/* read and check signature in PNG file */
ret = fread (buf, 1, 8, png_file);
if (ret != 8)
return FALSE;
ret = !png_sig_cmp (buf, 0, 8);
if (!ret)
return FALSE;
/* create png and info structures */
png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
if (!png_ptr)
return FALSE; /* out of memory */
info_ptr = png_create_info_struct (png_ptr);
if (!info_ptr)
{
png_destroy_read_struct (&png_ptr, NULL, NULL);
return FALSE; /* out of memory */
}
if (setjmp (png_jmpbuf(png_ptr)))
{
png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
return FALSE;
}
/* set up the input control for C streams */
png_init_io (png_ptr, png_file);
png_set_sig_bytes (png_ptr, 8); /* we already read the 8 signature bytes */
/* read the file information */
png_read_info (png_ptr, info_ptr);
/* get size and bit-depth of the PNG-image */
png_get_IHDR (png_ptr, info_ptr,
&width, &height, &bit_depth, &color_type,
NULL, NULL, NULL);
/* set-up the transformations */
/* transform paletted images into full-color rgb */
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_expand (png_ptr);
/* expand images to bit-depth 8 (only applicable for grayscale images) */
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
png_set_expand (png_ptr);
/* transform transparency maps into full alpha-channel */
if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
png_set_expand (png_ptr);
#ifdef NJET
/* downgrade 16-bit images to 8 bit */
if (bit_depth == 16)
png_set_strip_16 (png_ptr);
/* transform grayscale images into full-color */
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb (png_ptr);
/* only if file has a file gamma, we do a correction */
if (png_get_gAMA (png_ptr, info_ptr, &file_gamma))
png_set_gamma (png_ptr, (double) 2.2, file_gamma);
#endif
/* all transformations have been registered; now update info_ptr data,
* get rowbytes and channels, and allocate image memory */
png_read_update_info (png_ptr, info_ptr);
/* get the new color-type and bit-depth (after expansion/stripping) */
png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
NULL, NULL, NULL);
/* check for 16-bit files */
if (bit_depth == 16)
{
raw = FALSE;
//.........这里部分代码省略.........
开发者ID:0omega,项目名称:platform_external_libpng,代码行数:101,代码来源:png2pnm.c
示例15: newMMBitmapFromPNG
MMBitmapRef newMMBitmapFromPNG(const char *path, MMPNGReadError *err)
{
FILE *fp;
uint8_t header[8];
png_struct *png_ptr = NULL;
png_info *info_ptr = NULL;
png_byte bit_depth, color_type;
uint8_t *row, *bitmapData;
uint8_t bytesPerPixel;
png_uint_32 width, height, y;
uint32_t bytewidth;
if ((fp = fopen(path, "rb")) == NULL) {
if (err != NULL) *err = kPNGAccessError;
return NULL;
}
/* Initialize error code to generic value. */
if (err != NULL) *err = kPNGGenericError;
/* Validate the PNG. */
if (fread(header, 1, sizeof header, fp) == 0) {
if (err != NULL) *err = kPNGReadError;
goto bail;
} else if (!png_check_sig(header, sizeof(header))) {
if (err != NULL) *err = kPNGInvalidHeaderError;
goto bail;
}
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) goto bail;
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) goto bail;
/* Set up error handling. */
if (setjmp(png_jmpbuf(png_ptr))) {
goto bail;
}
png_init_io(png_ptr, fp);
/* Skip past the header. */
png_set_sig_bytes(png_ptr, sizeof header);
png_read_info(png_ptr, info_ptr);
/* Convert different image types to common type to be read. */
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
color_type = png_get_color_type(png_ptr, info_ptr);
/* Convert color palettes to RGB. */
if (color_type == PNG_COLOR_TYPE_PALETTE) {
png_set_palette_to_rgb(png_ptr);
}
/* Convert PNG to bit depth of 8. */
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) {
#ifdef PNG_LIBPNG_VER_SONUM
#if PNG_LIBPNG_VER_SONUM >= 14
png_set_expand_gray_1_2_4_to_8(png_ptr);
#else
png_set_gray_1_2_4_to_8(png_ptr);
#endif
#else
png_set_gray_1_2_4_to_8(png_ptr);
#endif
} else if (bit_depth == 16) {
png_set_strip_16(png_ptr);
}
/* Convert transparency chunk to alpha channel. */
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
png_set_tRNS_to_alpha(png_ptr);
}
/* Convert gray images to RGB. */
if (color_type == PNG_COLOR_TYPE_GRAY ||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(png_ptr);
}
/* Ignore alpha for now. */
if (color_type & PNG_COLOR_MASK_ALPHA) {
png_set_strip_alpha(png_ptr);
}
/* Get image attributes. */
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
bytesPerPixel = 3; /* All images decompress to this size. */
bytewidth = ADD_PADDING(width * bytesPerPixel); /* Align width. */
/* Decompress the PNG row by row. */
bitmapData = calloc(1, bytewidth * height);
row = pn
|
请发表评论