Set the modification time of a PNG

This program demonstrates how to set the modification date of a PNG graphic, which is the tIME chunk. The PNG created is the same as in Create a PNG with text segments.

#include <png.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
    
/* Write "bitmap" to a PNG file specified by "path"; returns 0 on
   success, non-zero on error. */

void save_png_to_file (const char *path)
{
    FILE * fp;
    png_structp png_ptr = NULL;
    png_infop info_ptr = NULL;
    size_t x, y;
    png_byte ** row_pointers = NULL;
    int pixel_size = 1;
    int depth = 8;
    int height = 100;
    int width = 100;
    png_time mod_time;

    fp = fopen (path, "wb");
    png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    info_ptr = png_create_info_struct (png_ptr);


    mod_time.year = 2010;
    mod_time.month = 12;
    mod_time.day = 29;
    mod_time.hour = 16;
    mod_time.minute = 20;
    mod_time.second = 20;

    png_set_tIME (png_ptr, info_ptr, & mod_time);
    
    png_set_IHDR (png_ptr,
                  info_ptr,
                  width,
                  height,
                  depth,
                  PNG_COLOR_TYPE_GRAY,
                  PNG_INTERLACE_NONE,
                  PNG_COMPRESSION_TYPE_DEFAULT,
                  PNG_FILTER_TYPE_DEFAULT);
    
    /* Initialize rows of PNG. */

    row_pointers = png_malloc (png_ptr, height * sizeof (png_byte *));
    for (y = 0; y < height; y++) {
        png_byte *row = 
            png_malloc (png_ptr, sizeof (uint8_t) * width * pixel_size);
        row_pointers[y] = row;

        /* Fill the image with random data. */

        for (x = 0; x < width; x++) {
            *row++ = random () % 256;
        }
    }
    
    /* 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);

    for (y = 0; y < height; y++) {
        png_free (png_ptr, row_pointers[y]);
    }
    png_free (png_ptr, row_pointers);
    
    png_destroy_write_struct (&png_ptr, &info_ptr);
    fclose (fp);
}

int main ()
{
    save_png_to_file ("time.png");
    return 0;
}

Copyright © Ben Bullock 2009-2023. All rights reserved. For comments, questions, and corrections, please email Ben Bullock (benkasminbullock@gmail.com) or use the discussion group at Google Groups. / Privacy / Disclaimer