2012-04-19 2 views

ответ

0

Не удалось найти алгоритм для определения размеров, который Imagick::thumbnailImage($w, $h) дает возможность обрабатывать все возможные ситуации с точностью 100%. (Например, случаи, когда $w или $h являются 0 и т.д.) Таким образом, я сделал эту функцию:

function thumbSize($pic, $thumbW, $thumbH) { 
    //make a white image of the same size 
    $picsize = $pic->getImageGeometry(); 
    $whitepic=new Imagick(); 
    $whitepic->newImage($picsize['width'], $picsize['height'], "white"); 
    $whitepic->thumbnailImage($thumbW, $thumbH); 
    return $whitepic->getImageGeometry(); 
} 

К сожалению, он должен изменить размер изображения, чтобы работать; он во много раз медленнее, чем решение на основе алгоритма. Но это работает.

Если у кого-то есть лучший ответ, я проверю его.

+1

Вы можете создать изображение с форматом «СЕРЫЙ», чтобы немного ускорить его. –

1

Возможно что-то вроде этого ...

# 3:2 format 
$w = 120; # desired width 
$h = 80; # desired height 

$r = 640/480; # current width/height 4:3 format 

if ($w/$h < $r) 
    $w = $h * $r; 
else 
    $h = $w/$r; 

echo $w, $h; # 120x90 4:3 format 

Если вы даете размеры (текущий вес & ч, желательные ж & ч, а один производится Imagick), было бы более полезным.

0

Предположительно, один из размеров, будь то ширина или высота, будет точно соответствовать размеру, указанному в вашем миниатюрном вызове. Вы можете определить, какой из них можно сравнить с отношением thumbW/width и thumbH/height, будет использоваться меньшее из двух. Размеры миниатюр - это соотношение номинальной ширины * и высоты *. Осталось только преобразовать в целые числа, а выбор округлен, округлен и округлен до ближайшего. Я не знаю, какой из них использует Imagick, но экспериментировать и экспериментировать с ним не следует.

Я также не знаю, что произойдет, когда оба отношения меньше единицы, т. Е. Когда исходное изображение меньше требуемого размера эскиза. Простой эксперимент должен прояснить это.

Извините, что не выполнял эксперименты самостоятельно, но PHP не в моем репертуаре.

Смежные вопросы