Я пытаюсь создать эскиз. Ну, нет проблем до сих пор. Я использую WideImage Library.
Задача состоит в том, чтобы обрезать изображение, когда его соотношение сторон мало отличается от соотношения сторон эскиза, который необходимо сделать. Если пропорции отличаются слишком сильно, изображение вставляется в цвет и уменьшается до конечного разрешения. Это работает.
Я не хочу вставлять изображения, если соотношение сторон только немного отличается, поэтому обрезку можно выполнить, не теряя слишком много информации.
Решение, которое я придумал, создает значение разницы ($diff
), которое приводит к сбою, если исходное изображение имеет разрешение, например 400x1000.
Может быть, нужно учитывать пропорции пикселя?
// $values contains thumbnail resolution
// calculate proportional dest width if needed
if (!isset($values['w'])) {
$values['w'] = round($values['h'] * ($orig_width / $orig_height));
}
// calculate proportional dest height if needed
if (!isset($values['h'])) {
$values['h'] = round($values['w'] * ($orig_height / $orig_width));
}
// this is what it is about
$orig_diff = (abs($orig_width - $orig_height) * 100) / max(array($orig_width, $orig_height));
$thumb_diff = (abs($values['w'] - $values['h']) * 100) / max(array($values['w'], $values['h']));
$diff = abs($orig_diff - $thumb_diff);
// crop if ratio difference is small
if ($diff < 10) {
$image = $image->resize($values['w'], $values['h'], 'outside', 'any');
$image = $image->crop("center", "middle", $values['w'], $values['h']);
} else {
// resize
if ($orig_width > $orig_height) {
$image = $image->resize($values['w'], $values['h'], 'inside', 'down');
} else {
$image = $image->resize(null, $values['h'], 'inside', 'down');
}
}
// embed if nessesary ( this is working and can be ignored)
if ($image->getWidth() < $values['w'] || $image->getHeight() < $values['h']) {
$rgb = array();
$resize_color = 'FFFFFF';
for ($x = 0; $x < 3; $x++) {
$rgb[$x] = hexdec(substr($resize_color, (2 * $x), 2));
}
$white = $image->allocateColor($rgb[0], $rgb[1], $rgb[2]);
$image = $image->resizeCanvas($values['w'], $values['h'], 'center', 'middle', $white);
}