« Return to Thread: Fwd: how to set the background color

Fwd: how to set the background color

by 曾弘 :: Rate this Message:

Reply to Author | View in Thread


Hi 
I have a question about the background color. This is my source codes and I read the png picture(Test2.png)
and the color type is PNG_COLOR_TYPE_RGB_ALPHA. 
The background color us still "black". How can I make it as "white" ?
Can you help me
Jeffrey



/*
 */

#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





--
Jeffrey Tseng(曾弘)
Mobile phone: 0952-432-332




------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
png-mng-implement mailing list
png-mng-implement@...
https://lists.sourceforge.net/lists/listinfo/png-mng-implement

Test2.png (144K) Download Attachment
png2rgb.c (12K) Download Attachment

 « Return to Thread: Fwd: how to set the background color