@@ -110,6 +110,62 @@ int gdImageScatterEx(gdImagePtr im, gdScatterPtr scatter)
110
110
return 1 ;
111
111
}
112
112
113
+ int gdImagePixelate (gdImagePtr im , int block_size , const unsigned int mode )
114
+ {
115
+ int x , y ;
116
+
117
+ if (block_size <= 0 ) {
118
+ return 0 ;
119
+ } else if (block_size == 1 ) {
120
+ return 1 ;
121
+ }
122
+ switch (mode ) {
123
+ case GD_PIXELATE_UPPERLEFT :
124
+ for (y = 0 ; y < im -> sy ; y += block_size ) {
125
+ for (x = 0 ; x < im -> sx ; x += block_size ) {
126
+ if (gdImageBoundsSafe (im , x , y )) {
127
+ int c = gdImageGetPixel (im , x , y );
128
+ gdImageFilledRectangle (im , x , y , x + block_size - 1 , y + block_size - 1 , c );
129
+ }
130
+ }
131
+ }
132
+ break ;
133
+ case GD_PIXELATE_AVERAGE :
134
+ for (y = 0 ; y < im -> sy ; y += block_size ) {
135
+ for (x = 0 ; x < im -> sx ; x += block_size ) {
136
+ int a , r , g , b , c ;
137
+ int total ;
138
+ int cx , cy ;
139
+
140
+ a = r = g = b = c = total = 0 ;
141
+ /* sampling */
142
+ for (cy = 0 ; cy < block_size ; cy ++ ) {
143
+ for (cx = 0 ; cx < block_size ; cx ++ ) {
144
+ if (!gdImageBoundsSafe (im , x + cx , y + cy )) {
145
+ continue ;
146
+ }
147
+ c = gdImageGetPixel (im , x + cx , y + cy );
148
+ a += gdImageAlpha (im , c );
149
+ r += gdImageRed (im , c );
150
+ g += gdImageGreen (im , c );
151
+ b += gdImageBlue (im , c );
152
+ total ++ ;
153
+ }
154
+ }
155
+ /* drawing */
156
+ if (total > 0 ) {
157
+ c = gdImageColorResolveAlpha (im , r / total , g / total , b / total , a / total );
158
+ gdImageFilledRectangle (im , x , y , x + block_size - 1 , y + block_size - 1 , c );
159
+ }
160
+ }
161
+ }
162
+ break ;
163
+ default :
164
+ return 0 ;
165
+ }
166
+ return 1 ;
167
+ }
168
+
113
169
/* invert src image */
114
170
int gdImageNegate (gdImagePtr src )
115
171
{
0 commit comments