|
|
@@ -1,8 +1,97 @@ |
|
|
|
#include <stdio.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <string.h> |
|
|
|
#include <math.h> |
|
|
|
#include <png.h> |
|
|
|
|
|
|
|
static unsigned int * image_buffer = NULL; |
|
|
|
static unsigned int image_width = 0; |
|
|
|
static unsigned int image_height = 0; |
|
|
|
|
|
|
|
static void import_image (char * file_path) { |
|
|
|
png_image temporary = { 0 }; |
|
|
|
|
|
|
|
temporary.version = PNG_IMAGE_VERSION; |
|
|
|
|
|
|
|
if (png_image_begin_read_from_file (& temporary, file_path) == 0) { |
|
|
|
printf ("PNG: Image init fuck up!\n"); |
|
|
|
exit (EXIT_FAILURE); |
|
|
|
} |
|
|
|
|
|
|
|
temporary.format = PNG_FORMAT_RGB; |
|
|
|
|
|
|
|
image_width = temporary.width; |
|
|
|
image_height = temporary.height; |
|
|
|
|
|
|
|
image_buffer = calloc ((size_t) (image_width * image_height), sizeof (* image_buffer)); |
|
|
|
|
|
|
|
if (png_image_finish_read (& temporary, NULL, image_buffer, 0, NULL) == 0) { |
|
|
|
printf ("PNG: Image read fuck up!\n"); |
|
|
|
exit (EXIT_FAILURE); |
|
|
|
} |
|
|
|
|
|
|
|
png_image_free (& temporary); |
|
|
|
} |
|
|
|
|
|
|
|
static void export_image (char * file_path) { |
|
|
|
png_image temporary = { 0 }; |
|
|
|
|
|
|
|
temporary.version = PNG_IMAGE_VERSION; |
|
|
|
temporary.format = PNG_FORMAT_RGB; |
|
|
|
temporary.width = image_width; |
|
|
|
temporary.height = image_height; |
|
|
|
|
|
|
|
if (png_image_write_to_file (& temporary, file_path, 0, image_buffer, 0, NULL) == 0) { |
|
|
|
printf ("PNG: Image write fuck up!\n"); |
|
|
|
} |
|
|
|
|
|
|
|
png_image_free (& temporary); |
|
|
|
} |
|
|
|
|
|
|
|
int main (int argc, char * * argv) { |
|
|
|
(void) argc; |
|
|
|
(void) argv; |
|
|
|
return (0); |
|
|
|
FILE * file = NULL; |
|
|
|
|
|
|
|
size_t file_size = 0; |
|
|
|
|
|
|
|
if (argc != 4) { |
|
|
|
printf ("Encode: xiew -e input output\n"); |
|
|
|
printf ("Decode: xiew -d input output\n"); |
|
|
|
return (EXIT_FAILURE); |
|
|
|
} |
|
|
|
|
|
|
|
if (strcmp (argv [1], "-e") == 0) { |
|
|
|
printf ("Encoding...\n"); |
|
|
|
file = fopen (argv [2], "r"); |
|
|
|
if (file == NULL) printf ("File is null.\n"); |
|
|
|
fseek (file, 0, SEEK_END); |
|
|
|
file_size = (size_t) ftell (file); |
|
|
|
printf ("File size: %lu\n", file_size); |
|
|
|
fseek (file, 0, SEEK_SET); |
|
|
|
image_width = image_height = (unsigned int) (sqrt (((double) file_size) / 3.0) + 1); |
|
|
|
printf ("Image size: %u x %u\n", image_width, image_height); |
|
|
|
image_buffer = calloc ((size_t) (image_width * image_height), sizeof (* image_buffer)); |
|
|
|
image_buffer [0] = (unsigned int) file_size; |
|
|
|
fread (& image_buffer [1], sizeof (char), file_size, file); |
|
|
|
export_image (argv [3]); |
|
|
|
} else if (strcmp (argv [1], "-d") == 0) { |
|
|
|
printf ("Decoding...\n"); |
|
|
|
import_image (argv [2]); |
|
|
|
file = fopen (argv [3], "w"); |
|
|
|
if (file == NULL) printf ("File is null.\n"); |
|
|
|
file_size = image_buffer [0]; |
|
|
|
printf ("File size: %lu\n", file_size); |
|
|
|
fwrite (& image_buffer [1], sizeof (char), file_size, file); |
|
|
|
} else { |
|
|
|
printf ("Encode: xiew -e input output\n"); |
|
|
|
printf ("Decode: xiew -d input output\n"); |
|
|
|
return (EXIT_FAILURE); |
|
|
|
} |
|
|
|
|
|
|
|
if (image_buffer != NULL) { |
|
|
|
free (image_buffer); |
|
|
|
} |
|
|
|
|
|
|
|
fclose (file); |
|
|
|
|
|
|
|
return (EXIT_SUCCESS); |
|
|
|
} |