croptool_crop.c - croptool - Image cropping tool
HTML git clone git://lumidify.org/croptool.git (fast, but not encrypted)
HTML git clone https://lumidify.org/croptool.git (encrypted, but very slow)
HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/croptool.git (over tor)
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
croptool_crop.c (2521B)
---
1 /*
2 * Copyright (c) 2021-2022 lumidify <nobody@lumidify.org>
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 #include <stdio.h>
18 #include <string.h>
19 #include <stdlib.h>
20 #include <Imlib2.h>
21
22 int
23 main(int argc, char *argv[]) {
24 char *dst_filename;
25 char *format;
26 char alpha;
27 int w, h, x, y, n;
28 int orig_w, orig_h;
29 Imlib_Image src, dst;
30 Imlib_Load_Error error;
31 if (argc < 3 || argc > 4) {
32 fprintf(stderr,
33 "USAGE: croptool_crop <width>x<height>+<x>+<y> "
34 "<source filename> [destination filename]\n"
35 );
36 exit(1);
37 }
38 if (argc == 4)
39 dst_filename = argv[3];
40 else
41 dst_filename = argv[2];
42 if (sscanf(argv[1], "%dx%d+%d+%d%n", &w, &h, &x, &y, &n) != 4 ||
43 (unsigned)n != strlen(argv[1])) {
44 fprintf(stderr, "Invalid cropping rectangle specified.\n");
45 exit(1);
46 }
47 src = imlib_load_image(argv[2]);
48 if (!src) {
49 fprintf(stderr, "Unable to load image.\n");
50 exit(1);
51 }
52 imlib_context_set_image(src);
53 alpha = imlib_image_has_alpha();
54 format = strdup(imlib_image_format());
55 if (!format) {
56 fprintf(stderr, "Unable to allocate memory.\n");
57 exit(1);
58 }
59 orig_w = imlib_image_get_width();
60 orig_h = imlib_image_get_height();
61 if (w <= 0 || h <= 0 || x < 0 || y < 0 || x + w > orig_w || y + h > orig_h) {
62 fprintf(stderr, "Invalid cropping rectangle specified.\n");
63 exit(1);
64 }
65
66 dst = imlib_create_image(w, h);
67 if (!dst) {
68 fprintf(stderr, "Unable to create cropped image.\n");
69 exit(1);
70 }
71 imlib_context_set_image(dst);
72 imlib_image_set_has_alpha(alpha);
73 imlib_blend_image_onto_image(src, 1, x, y, w, h, 0, 0, w, h);
74
75 imlib_image_set_format(format);
76 imlib_save_image_with_error_return(dst_filename, &error);
77 if (error) {
78 fprintf(stderr, "Unable to save cropped image.\n");
79 exit(1);
80 }
81
82 imlib_free_image();
83 imlib_context_set_image(src);
84 imlib_free_image();
85 free(format);
86
87 return 0;
88 }