| Total Complexity | 48 | 
| Total Lines | 267 | 
| Duplicated Lines | 0 % | 
| Changes | 1 | ||
| Bugs | 0 | Features | 0 | 
Complex classes like Resizer often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Resizer, and based on these observations, apply Extract Interface, too.
| 1 | <?php  | 
            ||
| 25 | class Resizer  | 
            ||
| 26 | { | 
            ||
| 27 | public $sourceFile = '';  | 
            ||
| 28 | public $endFile = '';  | 
            ||
| 29 | public $maxWidth = 0;  | 
            ||
| 30 | public $maxHeight = 0;  | 
            ||
| 31 | public $imageMimetype = '';  | 
            ||
| 32 | public $jpgQuality = 90;  | 
            ||
| 33 | public $mergeType = 0;  | 
            ||
| 34 | public $mergePos = 0;  | 
            ||
| 35 | public $degrees = 0;  | 
            ||
| 36 | public $error = '';  | 
            ||
| 37 | |||
| 38 | /**  | 
            ||
| 39 | * resize image if size exceed given width/height  | 
            ||
| 40 | * @return string|bool  | 
            ||
| 41 | */  | 
            ||
| 42 | public function resizeImage()  | 
            ||
| 113 | }  | 
            ||
| 114 | |||
| 115 | /**  | 
            ||
| 116 | * @return bool|string  | 
            ||
| 117 | */  | 
            ||
| 118 | public function resizeAndCrop()  | 
            ||
| 119 |     { | 
            ||
| 120 | // check file extension  | 
            ||
| 121 |         switch ($this->imageMimetype) { | 
            ||
| 122 | case 'image/png':  | 
            ||
| 123 | $original = imagecreatefrompng($this->sourceFile);  | 
            ||
| 124 | break;  | 
            ||
| 125 | case 'image/jpeg':  | 
            ||
| 126 | $original = imagecreatefromjpeg($this->sourceFile);  | 
            ||
| 127 | break;  | 
            ||
| 128 | case 'image/gif':  | 
            ||
| 129 | $original = imagecreatefromgif($this->sourceFile);  | 
            ||
| 130 | break;  | 
            ||
| 131 | default:  | 
            ||
| 132 | return 'Unsupported format';  | 
            ||
| 133 | }  | 
            ||
| 134 | |||
| 135 |         if (!$original) { | 
            ||
| 136 | return false;  | 
            ||
| 137 | }  | 
            ||
| 138 | // GET ORIGINAL IMAGE DIMENSIONS  | 
            ||
| 139 | list($original_w, $original_h) = getimagesize($this->sourceFile);  | 
            ||
| 140 | |||
| 141 | // RESIZE IMAGE AND PRESERVE PROPORTIONS  | 
            ||
| 142 | $max_width_resize = $this->maxWidth;  | 
            ||
| 143 | $max_height_resize = $this->maxHeight;  | 
            ||
| 144 |         if ($original_w > $original_h) { | 
            ||
| 145 | $max_height_ratio = $this->maxHeight / $original_h;  | 
            ||
| 146 | $max_width_resize = (int)round($original_w * $max_height_ratio);  | 
            ||
| 147 |         } else { | 
            ||
| 148 | $max_width_ratio = $this->maxWidth / $original_w;  | 
            ||
| 149 | $max_height_resize = (int)round($original_h * $max_width_ratio);  | 
            ||
| 150 | }  | 
            ||
| 151 |         if ($max_width_resize < $this->maxWidth) { | 
            ||
| 152 | $max_height_ratio = $this->maxWidth / $max_width_resize;  | 
            ||
| 153 | $max_height_resize = (int)round($this->maxHeight * $max_height_ratio);  | 
            ||
| 154 | $max_width_resize = $this->maxWidth;  | 
            ||
| 155 | }  | 
            ||
| 156 | |||
| 157 | // CREATE THE PROPORTIONAL IMAGE RESOURCE  | 
            ||
| 158 | $thumb = imagecreatetruecolor($max_width_resize, $max_height_resize);  | 
            ||
| 159 |         if (!imagecopyresampled($thumb, $original, 0, 0, 0, 0, $max_width_resize, $max_height_resize, $original_w, $original_h)) { | 
            ||
| 160 | return false;  | 
            ||
| 161 | }  | 
            ||
| 162 | // CREATE THE CENTERED CROPPED IMAGE TO THE SPECIFIED DIMENSIONS  | 
            ||
| 163 | $final = imagecreatetruecolor($this->maxWidth, $this->maxHeight);  | 
            ||
| 164 | |||
| 165 | $max_width_offset = 0;  | 
            ||
| 166 | $max_height_offset = 0;  | 
            ||
| 167 |         if ($this->maxWidth < $max_width_resize) { | 
            ||
| 168 | $max_width_offset = (int)round(($max_width_resize - $this->maxWidth) / 2);  | 
            ||
| 169 |         } else { | 
            ||
| 170 | $max_height_offset = (int)round(($max_height_resize - $this->maxHeight) / 2);  | 
            ||
| 171 | }  | 
            ||
| 172 | |||
| 173 |         if (!imagecopy($final, $thumb, 0, 0, $max_width_offset, $max_height_offset, $max_width_resize, $max_height_resize)) { | 
            ||
| 174 | return false;  | 
            ||
| 175 | }  | 
            ||
| 176 | // STORE THE FINAL IMAGE - WILL OVERWRITE $this->endFile  | 
            ||
| 177 |         if (!imagejpeg($final, $this->endFile, $this->jpgQuality)) { | 
            ||
| 178 | return false;  | 
            ||
| 179 | }  | 
            ||
| 180 | |||
| 181 | return true;  | 
            ||
| 182 | }  | 
            ||
| 183 | |||
| 184 | public function mergeImage()  | 
            ||
| 185 |     { | 
            ||
| 186 | $dest = imagecreatefromjpeg($this->endFile);  | 
            ||
| 187 | $src = imagecreatefromjpeg($this->sourceFile);  | 
            ||
| 188 |         if (4 == $this->mergeType) { | 
            ||
| 189 | $imgWidth = (int)round($this->maxWidth / 2 - 1);  | 
            ||
| 190 | $imgHeight = (int)round($this->maxHeight / 2 - 1);  | 
            ||
| 191 | $posCol2 = (int)round($this->maxWidth / 2 + 1);  | 
            ||
| 192 | $posRow2 = (int)round($this->maxHeight / 2 + 1);  | 
            ||
| 193 |             switch ($this->mergePos) { | 
            ||
| 194 | case 1:  | 
            ||
| 195 | imagecopy($dest, $src, 0, 0, 0, 0, $imgWidth, $imgHeight); //top left  | 
            ||
| 196 | break;  | 
            ||
| 197 | case 2:  | 
            ||
| 198 | imagecopy($dest, $src, $posCol2, 0, 0, 0, $imgWidth, $imgHeight); //top right  | 
            ||
| 199 | break;  | 
            ||
| 200 | case 3:  | 
            ||
| 201 | imagecopy($dest, $src, 0, $posRow2, 0, 0, $imgWidth, $imgHeight); //bottom left  | 
            ||
| 202 | break;  | 
            ||
| 203 | case 4:  | 
            ||
| 204 | imagecopy($dest, $src, $posCol2, $posRow2, 0, 0, $imgWidth, $imgHeight); //bottom right  | 
            ||
| 205 | break;  | 
            ||
| 206 | }  | 
            ||
| 207 | }  | 
            ||
| 208 |         if (6 == $this->mergeType) { | 
            ||
| 209 | $imgWidth = (int)round($this->maxWidth / 3 - 1);  | 
            ||
| 210 | $imgHeight = (int)round($this->maxHeight / 2 - 1);  | 
            ||
| 211 | $posCol2 = (int)round($this->maxWidth / 3 + 1);  | 
            ||
| 212 | $posCol3 = $posCol2 + (int)round($this->maxWidth / 3 + 1);  | 
            ||
| 213 | $posRow2 = (int)round($this->maxHeight / 2 + 1);  | 
            ||
| 214 | |||
| 215 |             switch ($this->mergePos) { | 
            ||
| 216 | case 1:  | 
            ||
| 217 | imagecopy($dest, $src, 0, 0, 0, 0, $imgWidth, $imgHeight); //top left  | 
            ||
| 218 | break;  | 
            ||
| 219 | case 2:  | 
            ||
| 220 | imagecopy($dest, $src, $posCol2, 0, 0, 0, $imgWidth, $imgHeight); //top center  | 
            ||
| 221 | break;  | 
            ||
| 222 | case 3:  | 
            ||
| 223 | imagecopy($dest, $src, $posCol3, 0, 0, 0, $imgWidth, $imgHeight); //top right  | 
            ||
| 224 | break;  | 
            ||
| 225 | case 4:  | 
            ||
| 226 | imagecopy($dest, $src, 0, $posRow2, 0, 0, $imgWidth, $imgHeight); //bottom left  | 
            ||
| 227 | break;  | 
            ||
| 228 | case 5:  | 
            ||
| 229 | imagecopy($dest, $src, $posCol2, $posRow2, 0, 0, $imgWidth, $imgHeight); //bottom center  | 
            ||
| 230 | break;  | 
            ||
| 231 | case 6:  | 
            ||
| 232 | imagecopy($dest, $src, $posCol3, $posRow2, 0, 0, $imgWidth, $imgHeight); //bottom right  | 
            ||
| 233 | break;  | 
            ||
| 234 | }  | 
            ||
| 235 | }  | 
            ||
| 236 | imagejpeg($dest, $this->endFile);  | 
            ||
| 237 | |||
| 238 | imagedestroy($src);  | 
            ||
| 239 | imagedestroy($dest);  | 
            ||
| 240 | }  | 
            ||
| 241 | |||
| 242 | /**  | 
            ||
| 243 | * @return bool|string  | 
            ||
| 244 | */  | 
            ||
| 245 | public function rotateImage()  | 
            ||
| 292 | }  | 
            ||
| 293 | }  | 
            ||
| 294 |