Всем нам иногда приходится ресайзить картинки на сервере, и у любого php-кодера есть свой кусочек кода из 30 строк, который справляется с этой задачей. Правда, некоторые вообще не заморачиваются, вставляют картинки в оригинальном размере и тупо прописывают высоту-ширину, так что изображение ресайзится браузером (вот кстати, ребята, которые продают Тренинг поведения со скидкой от 50% - делают именно так).
Но мы легких путей не ищем, а используем чудо-пых. У моих 30 строк было все ништяк, кроме одной обидной мелочи - не умели они ресайзить PNG с прозрачностью. Если просишь отмасштабировать прозрачный PNG - появляется черный фон. Я всю жизнь ленился и просил тех, кто пользуется моими админками, прозрачные PNG не загружать - да и нафиг они нужны? :)
А тут вот прямо понадобилось-понадобилось, пришлось идти в яндекс за советом. Яндекс помог, все получилось, делюсь радостью и результатом.
1. Функция для ресайза - поскольку она у каждого своя, я показываю псевдокод и место вызова новой функции, сохраняющей прозрачность:
function resizeImage() {
// получаем размеры
// $type = [как-то получаем тип файла]
// в завимимомти от $type:
// $src = [imagecreatefromjpeg|imagecreatefrompng]
// считаем новые размеры
// $dst = imagecreatetruecolor($newwidth,$newheight);
// а теперь фокус:
// addTransparency($dst, $src);
// делаем imagecopyresampled();
// в зависимости от $type
// делаем imagejpeg|imagegif|imagepng
// и куда-то сохраняем
}
А теперь - сама addTransparency:
function addTransparency($dst, $src) {
$t_index = imagecolortransparent($src);
$t_color = array(
'red' => 255,
'green' => 255,
'blue' => 255
);
if ($t_index >= 0) {
$t_color = imagecolorsforindex($src, $t_index);
}
$t_index = imagecolorallocate(
$dst,
$t_color['red'],
$t_color['green'],
$t_color['blue']
);
imagefill($dst, 0, 0, $t_index);
imagecolortransparent($dst, $t_index);
}
Вуаля. Теперь черный фон появляться не должен.