Skip to content

Instantly share code, notes, and snippets.

@randomsequence
Last active September 16, 2023 04:35
Show Gist options
  • Save randomsequence/11006317 to your computer and use it in GitHub Desktop.
Save randomsequence/11006317 to your computer and use it in GitHub Desktop.
Extracting RAW Image Data from PNG

#Exporting RAW Image Data from PNG files with libpng

This is an Xcode project which uses libpng to export the raw image data from a png file.

Usage:

pngdump source.png destination.dat

This Xcode project links against libpng. On OS X that's available via homebrew

//
// main.m
// pngdump
//
// Created by Johnnie Walker on 17/04/2014.
// Copyright (c) 2014 LateNiteSoft. All rights reserved.
//
#import <Foundation/Foundation.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#define PNG_DEBUG 3
#include <png.h>
void abort_(const char * s, ...)
{
va_list args;
va_start(args, s);
vfprintf(stderr, s, args);
fprintf(stderr, "\n");
va_end(args);
abort();
}
int x, y;
int width, height;
png_byte color_type;
png_byte bit_depth;
png_structp png_ptr;
png_infop info_ptr;
int number_of_passes;
png_bytep * row_pointers;
size_t data_length;
// thank you @gcotenc http://zarb.org/~gc/html/libpng.html
void read_png_file(const char* file_name)
{
png_const_bytep header[8]; // 8 is the maximum size that can be checked
/* open file and test for it being a png */
FILE *fp = fopen(file_name, "rb");
if (!fp)
abort_("[read_png_file] File %s could not be opened for reading", file_name);
fread(header, 1, 8, fp);
if (png_sig_cmp(header, 0, 8))
abort_("[read_png_file] File %s is not recognized as a PNG file", file_name);
/* initialize stuff */
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr)
abort_("[read_png_file] png_create_read_struct failed");
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
abort_("[read_png_file] png_create_info_struct failed");
if (setjmp(png_jmpbuf(png_ptr)))
abort_("[read_png_file] Error during init_io");
png_init_io(png_ptr, fp);
png_set_sig_bytes(png_ptr, 8);
png_read_info(png_ptr, info_ptr);
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
color_type = png_get_color_type(png_ptr, info_ptr);
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
number_of_passes = png_set_interlace_handling(png_ptr);
png_read_update_info(png_ptr, info_ptr);
/* read file */
if (setjmp(png_jmpbuf(png_ptr)))
abort_("[read_png_file] Error during read_image");
png_size_t row_bytes = png_get_rowbytes(png_ptr,info_ptr);
data_length = row_bytes * height;
void *data = malloc(data_length);
row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
for (y=0; y<height; y++) {
row_pointers[y] = data;
data += row_bytes;
// row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(png_ptr,info_ptr));
}
png_read_image(png_ptr, row_pointers);
fclose(fp);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
const char *input = argv[1];
const char *output = argv[2];
read_png_file(input);
NSData *imageData = [NSData dataWithBytesNoCopy:row_pointers[0] length:data_length freeWhenDone:YES];
[imageData writeToFile:[NSString stringWithCString:output encoding:NSUTF8StringEncoding] atomically:NO];
}
return 0;
}
@Usernamemp44
Copy link

true

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment