1 /* LiquidRescaling Library
2 * Copyright (C) 2007-2009 Carlo Baldassi (the "Author") <carlobaldassi@gmail.com>.
5 * This library implements the algorithm described in the paper
6 * "Seam Carving for Content-Aware Image Resizing"
7 * by Shai Avidan and Ariel Shamir
8 * which can be found at http://www.faculty.idc.ac.il/arik/imret.pdf
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU Lesser General Public License as published by
12 * the Free Software Foundation; version 3 dated June, 2007.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this program; if not, see <http://www.gnu.org/licenses/>
23 #include <lqr/lqr_all.h>
29 /**** LQR_CARVER_BIAS STRUCT FUNTIONS ****/
33 lqr_carver_bias_add_area(LqrCarver
*r
, gdouble
*buffer
, gint bias_factor
, gint width
, gint height
, gint x_off
, gint y_off
)
46 if ((r
->w
!= r
->w0
) || (r
->w_start
!= r
->w0
) ||
47 (r
->h
!= r
->h0
) || (r
->h_start
!= r
->h0
))
49 CATCH (lqr_carver_flatten(r
));
53 CATCH (lqr_carver_transpose(r
));
58 x2
= MIN (r
->w
, width
+ x_off
);
59 y2
= MIN (r
->h
, height
+ y_off
);
61 for (y
= 0; y
< y2
- y1
; y
++)
63 for (x
= 0; x
< x2
- x1
; x
++)
65 bias
= (gfloat
) ((gdouble
) bias_factor
* buffer
[y
* width
+ x
] / 2);
67 r
->bias
[(y
+ y1
) * r
->w0
+ (x
+ x1
)] += bias
;
79 lqr_carver_bias_add(LqrCarver
*r
, gdouble
*buffer
, gint bias_factor
)
81 return lqr_carver_bias_add_area(r
, buffer
, bias_factor
, r
->w0
, r
->h0
, 0, 0);
86 lqr_carver_bias_add_rgb_area(LqrCarver
*r
, guchar
*rgb
, gint bias_factor
, gint channels
, gint width
, gint height
, gint x_off
, gint y_off
)
88 gint x
, y
, k
, c_channels
;
90 gint x0
, y0
, x1
, y1
, x2
, y2
;
102 if ((r
->w
!= r
->w0
) || (r
->w_start
!= r
->w0
) ||
103 (r
->h
!= r
->h0
) || (r
->h_start
!= r
->h0
))
105 CATCH (lqr_carver_flatten(r
));
110 CATCH (lqr_carver_transpose(r
));
113 has_alpha
= (channels
== 2 || channels
>= 4);
114 c_channels
= channels
- (has_alpha
? 1 : 0);
120 x2
= MIN (r
->w0
, width
+ x_off
);
121 y2
= MIN (r
->h0
, height
+ y_off
);
123 for (y
= 0; y
< y2
- y1
; y
++)
125 for (x
= 0; x
< x2
- x1
; x
++)
128 for (k
= 0; k
< c_channels
; k
++)
130 sum
+= rgb
[((y
- y0
) * width
+ (x
- x0
)) * channels
+ k
];
133 bias
= (gfloat
) ((gdouble
) bias_factor
* sum
/ (2 * 255 * c_channels
));
136 bias
*= (gfloat
) rgb
[((y
- y0
) * width
+ (x
- x0
) + 1) * channels
- 1] / 255;
139 r
->bias
[(y
+ y1
) * r
->w0
+ (x
+ x1
)] += bias
;
147 CATCH (lqr_carver_transpose(r
));
155 lqr_carver_bias_add_rgb(LqrCarver
*r
, guchar
*rgb
, gint bias_factor
, gint channels
)
157 return lqr_carver_bias_add_rgb_area(r
, rgb
, bias_factor
, channels
, r
->w0
, r
->h0
, 0, 0);
161 /**** END OF LQR_CARVER_BIAS CLASS FUNCTIONS ****/