function imageapi_gd_image_smartcrop_crop in Smart Crop 6
Crop an image, removing the lowest entropy areas.
Parameters
array $image_data:
int $requested_x:
int $requested_y:
Return value
booleon TRUE if successful
1 call to imageapi_gd_image_smartcrop_crop()
- imageapi_gd_image_smartcrop_scale in ./
imageapi_gd.inc - Scale and crop an image to the specified size using GD.
File
- ./
imageapi_gd.inc, line 39 - libgd implementation of smartcrop action.
Code
function imageapi_gd_image_smartcrop_crop(&$image_data, $requested_x, $requested_y) {
$image = $image_data->resource;
$dx = imagesx($image) - min(imagesx($image), $requested_x);
$dy = imagesy($image) - min(imagesy($image), $requested_y);
$left = $top = 0;
$left_entropy = $right_entropy = $top_entropy = $bottom_entropy = 0;
$right = imagesx($image);
$bottom = imagesy($image);
// Slice from left and right edges until the correct width is reached.
while ($dx) {
$slice = min($dx, 10);
// Calculate the entropy of the new slice.
if (!$left_entropy) {
$left_entropy = _smartcrop_gd_entropy_slice($image_data, $left, $top, $slice, imagesy($image));
}
if (!$right_entropy) {
$right_entropy = _smartcrop_gd_entropy_slice($image_data, $right - $slice, $top, $slice, imagesy($image));
}
// Remove the lowest entropy slice.
if ($left_entropy >= $right_entropy) {
$right -= $slice;
$right_entropy = 0;
}
else {
$left += $slice;
$left_entropy = 0;
}
$dx -= $slice;
}
// Slice from the top and bottom edges until the correct width is reached.
while ($dy) {
$slice = min($dy, 10);
// Calculate the entropy of the new slice.
if (!$top_entropy) {
$top_entropy = _smartcrop_gd_entropy_slice($image_data, $left, $top, $requested_x, $slice);
}
if (!$bottom_entropy) {
$bottom_entropy = _smartcrop_gd_entropy_slice($image_data, $left, $bottom - $slice, $requested_x, $slice);
}
// Remove the lowest entropy slice.
if ($top_entropy >= $bottom_entropy) {
$bottom -= $slice;
$bottom_entropy = 0;
}
else {
$top += $slice;
$top_entropy = 0;
}
$dy -= $slice;
}
// Finally, crop the image using the coordinates found above.
$cropped_image = imageapi_gd_create_tmp($image_data, $right - $left, $bottom - $top);
imagecopy($cropped_image, $image, 0, 0, $left, $top, $right - $left, $bottom - $top);
imagedestroy($image_data->resource);
$image_data->resource = $cropped_image;
$image_data->info['width'] = $requested_x;
$image_data->info['height'] = $requested_y;
return TRUE;
}