From 2633662c4b251566181296b7d0c2400cfff12eca Mon Sep 17 00:00:00 2001 From: Phuntsok Drak-pa Date: Tue, 27 Nov 2018 23:59:04 +0100 Subject: [PATCH] Added tolerance option and result example with -t 5 --- img/asterix5p.png | Bin 0 -> 52506 bytes src/compress.c | 35 +++++++++++++++++++++++++++++------ src/compress.h | 3 ++- src/main.c | 36 ++++++++++++++++++++++++------------ 4 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 img/asterix5p.png diff --git a/img/asterix5p.png b/img/asterix5p.png new file mode 100644 index 0000000000000000000000000000000000000000..6183f552f04a4b884da9e1aa6db5753119568212 GIT binary patch literal 52506 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%0A_j3nG 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 == t_zone->red && t_pixel->green == t_zone->green && - t_pixel->blue == t_zone->blue) - ? 1 - : 0; + int diff_red, diff_green, diff_blue; + if (tolerance == 0) { + return (t_pixel->red == t_zone->red && t_pixel->green == t_zone->green && + t_pixel->blue == t_zone->blue) + ? 1 + : 0; + } + diff_red = (abs((int32_t)t_zone->red - (int32_t)t_pixel->red) * 100) / 255; + diff_green = + (abs((int32_t)t_zone->green - (int32_t)t_pixel->green) * 100) / 255; + diff_blue = (abs((int32_t)t_zone->blue - (int32_t)t_pixel->blue) * 100) / 255; + return ((diff_red + diff_green + diff_blue) / 3) <= tolerance; } /** @@ -172,14 +192,17 @@ void write_compressed_file(Image *t_img, FILE *t_output, darray *t_zones) { * * \param[in] t_input_file Nom/chemin du fichier `.ppm` d'entrée * \param[in] t_output_file Nom/chemin du fichier `.su` de sortie + * \param[in] t_tolerance Pourcentage de tolérance de couleur */ -void compress(const char *t_input_file, const char *t_output_file) { +void compress(const char *t_input_file, const char *t_output_file, + int32_t t_tolerance) { Image *img; darray *zones; FILE *output_file; if (!t_output_file) { t_output_file = DEFAULT_COMPRESSED_NAME; } + tolerance = t_tolerance; img = newImage(); imageLoadPPM(t_input_file, img); output_file = get_file(t_output_file, "wb"); diff --git a/src/compress.h b/src/compress.h index 9b2f832..50f7c25 100644 --- a/src/compress.h +++ b/src/compress.h @@ -23,6 +23,7 @@ void write_segments(FILE *t_output, darray *t_segments); /// Écrit les données compressées dans le fichier de sortie void write_compressed_file(Image *t_img, FILE *t_output, darray *t_zones); /// Compresse l'image d'entrée -void compress(const char *t_input_file, const char *t_output_file); +void compress(const char *t_input_file, const char *t_output_file, + int32_t tolerance); #endif /* SRC_COMPRESS_H_ */ diff --git a/src/main.c b/src/main.c index 8ba5bee..4676ca7 100644 --- a/src/main.c +++ b/src/main.c @@ -24,18 +24,21 @@ */ void help(int t_exit_code) { puts("Usage:\n" - "surfaces-unies -i path [-o path] [-options]\n\n" + "surfaces-unies -i path [-o path] [--options] [-t 0-100]\n\n" "The default action is to compress the mandatory input image to a .su\n" "file saved in the current directory.\n" "The input image MUST be saved in the ppm format.\n" "Options available:\n" - "-h --help\n\tdisplay the current message\n" - "-i --input\n\tpath to the input file (MANDATORY)\n" + "-h --help\n\tDisplay the current message\n" + "-i --input\n\tPath to the input file (MANDATORY)\n" "-o --output\n" - "\tpath to the output file (if the file already exists, it will be\n" + "\tPath to the output file (if the file already exists, it will be\n" "\toverwritten)\n" - "-c --compress\n\tcompress the input file\n" - "-u --uncompress\n\tuncompresses the input file to the output file."); + "-t --tolerance\n" + "\tColor tolerance for lossy compression. By default at 0 for lossless\n" + "\tcompression, at 100 will consider every color to be the same.\n" + "-c --compress\n\tCompress the input file\n" + "-u --uncompress\n\tUncompresses the input file to the output file."); exit(t_exit_code); } @@ -49,9 +52,10 @@ void help(int t_exit_code) { * supplémentaires aux fonctions. */ struct Argres { - char *input; /*!< Nom du fichier d'entrée */ - char *output; /*!< Nom du fichier de sortie */ - char compress; /*!< Le fichier d'entrée doit-il être compressé ? */ + char *input; /*!< Nom du fichier d'entrée */ + char *output; /*!< Nom du fichier de sortie */ + char compress; /*!< Le fichier d'entrée doit-il être compressé ? */ + int32_t tolerance; /*!< Tolérance en pourcentage des différences de couleur */ }; typedef struct Argres Argres; @@ -72,6 +76,12 @@ void get_args(Argres *t_args, const int *const t_c) { case 'o': (*t_args).output = optarg; break; case 'c': (*t_args).compress = 1; break; case 'u': (*t_args).compress = 0; break; + case 't': + (*t_args).tolerance = atoi(optarg); + if(t_args->tolerance < 0 || t_args->tolerance > 100) { + help(ARGERROR); + } + break; case '?': default: help(ARGERROR); } @@ -95,16 +105,18 @@ Argres process_args(const int t_argc, char *t_argv[]) { res.input = NULL; res.compress = 1; res.output = NULL; + res.tolerance = 0; while (1) { int option_index = 0; static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"input", required_argument, NULL, 'i'}, {"output", required_argument, NULL, 'o'}, + {"tolerance", required_argument, NULL, 't'}, {"compress", no_argument, NULL, 'c'}, {"uncompress", no_argument, NULL, 'u'}, {NULL, 0, NULL, 0}}; - int c = getopt_long(t_argc, t_argv, "hi:o:cu", long_options, &option_index); + int c = getopt_long(t_argc, t_argv, "hi:o:t:cu", long_options, &option_index); if (c == -1) break; get_args(&res, &c); @@ -129,8 +141,8 @@ int main(int argc, char **argv) { fprintf(stderr, "ERROR: no input file."); help(ARGERROR); } - if(argresults.compress) { - compress(argresults.input, argresults.output); + if (argresults.compress) { + compress(argresults.input, argresults.output, argresults.tolerance); } else { uncompress(argresults.input, argresults.output); }