@@ -110,6 +110,62 @@ int gdImageScatterEx(gdImagePtr im, gdScatterPtr scatter)
110110 return 1 ;
111111}
112112
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+
113169/* invert src image */
114170int gdImageNegate (gdImagePtr src )
115171{
0 commit comments