I have a question about the background color. This is my source codes and I read the png picture(Test2.png)
The background color us still "black". How can I make it as "white" ?
/*
*/
#if 1
#include "png.h"
#include "pngpriv.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <png.h>
#include "bitstream.h"
typedef struct my_png_buffer_ {
unsigned char *data;
unsigned long data_len;
unsigned long data_offset;
} my_png_buffer;
void png_data_read_func(png_structp png_ptr, png_bytep buf, png_size_t size){
my_png_buffer *png_buff = (my_png_buffer *)png_get_io_ptr(png_ptr);
if (png_buff->data_offset + size <= png_buff->data_len) {
memcpy(buf, png_buff->data + png_buff->data_offset, size);
png_buff->data_offset += size;
} else {
fprintf(stderr, "! png_buff->data_offset(%lu) + size(%d) <= png_buff->data_len(%lu)\n",
png_buff->data_offset, size, png_buff->data_len);
png_error(png_ptr,"png_read_read_func failed");
}
}
void png_data_read(png_structp png_ptr, my_png_buffer *png_buff) {
png_set_read_fn(png_ptr, (png_voidp) png_buff,
(png_rw_ptr)png_data_read_func);
}
/*************************************************/
#if 0
static int multiply_alpha (int alpha, int color);
static void premultiply_data (png_structp png,png_row_infop row_info,png_bytep data);
#endif
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
/*************************************************/
int main(int argc, char **argv) {
char *png_filename = NULL;
unsigned char *Buffer, *BufferP;
struct stat filestat;
FILE *fw = NULL;
FILE *fp = NULL;
my_png_buffer png_buff;
int is_png, OneFileFlag = 0, bpp = 0,color_type = 0,num_pass = 0;
png_uint_32 png_width, png_height;
png_bytepp image_data;
png_uint_32 x, y;
//static PNG_CONST char *FileName = "pngoutT1";
//static PNG_CONST char *FileName = "pngoutT2";
//static PNG_CONST char *FileName = "pngoutT3";
//static PNG_CONST char *FileName = "pngoutT4";
//static PNG_CONST char *FileName = "pngoutT5";
//static PNG_CONST char *FileName = "pngoutT6";
//static PNG_CONST char *FileName = "pngoutT7";
//static PNG_CONST char *FileName = "pngoutT8";
//static PNG_CONST char *FileName = "pngoutT9";
//static PNG_CONST char *FileName = "pngoutT10";
//static PNG_CONST char *FileName = "pngoutT11";
//static PNG_CONST char *FileName = "pngoutT12";
//static PNG_CONST char *FileName = "pngoutT13";
//static PNG_CONST char *FileName = "pngoutT14";
//static PNG_CONST char *FileName = "pngoutT15";
//static PNG_CONST char *FileName = "Bin128_128";
//static PNG_CONST char *FileName = "pngbar88_31";
//static PNG_CONST char *FileName = "pngnow98_31";
//static PNG_CONST char *FileName = "Test1_128_128";
static PNG_CONST char *FileName = "Test2_256_256";
//static PNG_CONST char *FileName = "Visusalpng_32_32";
//static PNG_CONST char *FileName = "toucan_162_150";
//static PNG_CONST char *FileName = "pngtest91_69";
if (argc != 3) {
char *program_filename = argv[0];
fprintf(stderr, "Usage: %s <png_filename>\n", program_filename);
return EXIT_FAILURE;
}
png_filename = argv[1];
OneFileFlag = atol(argv[2]);
if(stat(png_filename, &filestat)) {
printf("stat pngfile");
return EXIT_FAILURE;
}
png_buff.data_len = filestat.st_size;
png_buff.data_offset = 0;
fp = fopen(png_filename, "rb");
if (! fp) {
fprintf(stderr, "Can't open file(%s)\n", png_filename);
return EXIT_FAILURE;
}
png_buff.data = calloc(png_buff.data_len, 1);
fread(png_buff.data, 1, png_buff.data_len, fp);
fclose(fp);
is_png = png_check_sig((png_bytep)png_buff.data, 8);
if (! is_png) {
fprintf(stderr, "is not PNG!\n");
free(png_buff.data);
return EXIT_FAILURE;
}
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL,NULL,NULL);
if (! png_ptr) {
fprintf(stderr, "can't create read_struct\n");
free(png_buff.data);
return EXIT_FAILURE;
}
png_infop png_info_ptr = png_create_info_struct(png_ptr);
if (! png_info_ptr) {
fprintf(stderr, "can't create info_struct\n");
png_destroy_read_struct (&png_ptr, NULL, NULL);
free(png_buff.data);
return EXIT_FAILURE;
}
png_data_read(png_ptr, &png_buff);
png_read_info(png_ptr, png_info_ptr);
png_get_IHDR(png_ptr, png_info_ptr,
&png_width, &png_height, &bpp, &color_type,
NULL, NULL, NULL);
/************************************************************/
#if 0
png_bytep trans = 5;
int num_trans = 0;
png_color_16p trans_values = 5;
png_uint_32 transparent_value = png_get_tRNS(png_ptr, png_info_ptr, &trans, &num_trans, &trans_values);
printf("transparent_value is %d\n",transparent_value);
printf("num_trans=%d\n", num_trans);
printf("trans_values=%d\n", trans_values);
printf("trans=%d\n", trans);
#endif
//return 0;
/************************************************************/
switch(color_type) {
case PNG_COLOR_TYPE_RGB_ALPHA:
printf("(RGB_ALPHA) %d\n",bpp);
if(bpp == 16){
printf("bpp RGB_ALPHA %d\n",bpp);
//png_set_gray_to_rgb(png_ptr);
png_set_strip_16(png_ptr);
}
if(color_type & PNG_COLOR_MASK_ALPHA) {
//png_set_strip_alpha(png_ptr);
png_set_invert_alpha(png_ptr);
//png_set_packing(png_ptr);
//printf("111111111111\n");
//return 0;
}
png_bytep trans = NULL;
int num_trans = 0;
png_color_16p trans_values = NULL;
png_uint_32 transparent_value = png_get_tRNS(png_ptr, png_info_ptr, &trans, &num_trans, &trans_values);
printf("transparent_value is %d\n",transparent_value);
#if 1
//png_color_16 blueBackground = { 0, 0, 0, 0xFFFF, 0};
png_color_16 blueBackground = { 0, 0, 0, 0xFF, 0};
png_color_16p imageBackground;
const double screenGamma = 2.2;
if (png_get_bKGD(png_ptr, png_info_ptr, &imageBackground)) {
png_set_background(png_ptr, imageBackground, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
printf("background found in png file!\n");
}
else {
png_set_background(png_ptr, &blueBackground, PNG_BACKGROUND_GAMMA_SCREEN, 0, screenGamma);
printf("background NOT found in png file!\n");
}
#endif
break;
default:
printf("color_type(%d) not implement yet.\n",color_type);
return 0;
}
png_read_update_info(png_ptr, png_info_ptr);
/**************************************************/
if (OneFileFlag) {
if ((fw = fopen(FileName, "wb")) == NULL) {
printf("Can't open input file name.");
fclose(fw);
}
}
if (png_get_interlace_type(png_ptr, png_info_ptr) == PNG_INTERLACE_ADAM7) {
png_set_interlace_handling(png_ptr);
printf("XXXXXXXXXXXXXXXXXXXXX\n");
}
#ifdef PNG_READ_INTERLACING_SUPPORTED
printf("1008 111111111111\n");
num_pass = png_set_interlace_handling(png_ptr);
#else
printf("2222222222\n");
if (png_ptr->interlaced) {
png_error(png_ptr,"Cannot read interlaced image -- interlace handler disabled");
num_pass = 1;
}
#endif
if(num_pass > 1) {
printf("Do not support Interlance num_pass is %d\n",num_pass);
fclose(fw);
return 0;
}
//return 0;
/////////////////////////////////////////////////////////////////////////////
if ((Buffer = (unsigned char *) malloc(png_width * 3)) == NULL)
printf("Failed to allocate memory required, aborted.");
image_data = (png_bytepp) png_malloc(png_ptr,png_height * sizeof(png_bytep));
for (y=0; y < png_height; y++) {
image_data[y] = (png_bytep)png_malloc(png_ptr,png_get_rowbytes(png_ptr, png_info_ptr));
png_read_rows(png_ptr, &image_data[y], NULL, 1);
printf(" y is %d png_height is %d\n",y,png_height);
if (OneFileFlag) {
if (color_type == PNG_COLOR_TYPE_RGB_ALPHA){
printf("1012 EEEEEEEERRRRRRR PNG_COLOR_TYPE_RGB_ALPHA\n");
for (x=0, BufferP = Buffer; x < png_width; x++) {
*BufferP++ = image_data[y][4*x]; //R
*BufferP++ = image_data[y][4*x+1]; //G
*BufferP++ = image_data[y][4*x+2]; // B
}
if (fwrite(Buffer, png_width * 3, 1, fw) != 1)
printf("Write to file(s) failed.");
}
}
free(image_data[y]);
}
free(image_data);
free((char *) Buffer);
/********************************************************/
png_read_end(png_ptr, png_info_ptr);
png_destroy_read_struct(&png_ptr, &png_info_ptr, NULL);
free(png_buff.data);
fclose(fw);
return EXIT_SUCCESS;
}
#endif