|
@@ -396,7 +396,9 @@ vips_extract_area_go(VipsImage *in, VipsImage **out, int left, int top, int widt
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-vips_trim(VipsImage *in, VipsImage **out, double threshold) {
|
|
|
+vips_trim(VipsImage *in, VipsImage **out, double threshold,
|
|
|
+ gboolean smart, double r, double g, double b,
|
|
|
+ gboolean equal_hor, gboolean equal_ver) {
|
|
|
#if VIPS_SUPPORT_FIND_TRIM
|
|
|
VipsImage *tmp;
|
|
|
|
|
@@ -410,15 +412,20 @@ vips_trim(VipsImage *in, VipsImage **out, double threshold) {
|
|
|
|
|
|
double *bg;
|
|
|
int bgn;
|
|
|
+ VipsArrayDouble *bga;
|
|
|
|
|
|
- if (vips_getpoint(tmp, &bg, &bgn, 0, 0, NULL)) {
|
|
|
- clear_image(&tmp);
|
|
|
- return 1;
|
|
|
+ if (smart) {
|
|
|
+ if (vips_getpoint(tmp, &bg, &bgn, 0, 0, NULL)) {
|
|
|
+ clear_image(&tmp);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ bga = vips_array_double_new(bg, bgn);
|
|
|
+ } else {
|
|
|
+ bga = vips_array_double_newv(3, r, g, b);
|
|
|
+ bg = 0;
|
|
|
}
|
|
|
|
|
|
- VipsArrayDouble *bga = vips_array_double_new(bg, bgn);
|
|
|
-
|
|
|
- int left, top, width, height;
|
|
|
+ int left, right, top, bot, width, height, diff;
|
|
|
|
|
|
if (vips_find_trim(tmp, &left, &top, &width, &height, "background", bga, "threshold", threshold, NULL)) {
|
|
|
clear_image(&tmp);
|
|
@@ -427,6 +434,28 @@ vips_trim(VipsImage *in, VipsImage **out, double threshold) {
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+ if (equal_hor) {
|
|
|
+ right = in->Xsize - left - width;
|
|
|
+ diff = right - left;
|
|
|
+ if (diff > 0) {
|
|
|
+ width += diff;
|
|
|
+ } else if (diff < 0) {
|
|
|
+ left = right;
|
|
|
+ width -= diff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (equal_ver) {
|
|
|
+ bot = in->Ysize - top - height;
|
|
|
+ diff = bot - top;
|
|
|
+ if (diff > 0) {
|
|
|
+ height += diff;
|
|
|
+ } else if (diff < 0) {
|
|
|
+ top = bot;
|
|
|
+ height -= diff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
clear_image(&tmp);
|
|
|
vips_area_unref((VipsArea *)bga);
|
|
|
g_free(bg);
|