Dubrowsky
Хроники одного дупла
Блогово  →  WebDev  → 

Ресайз PNG с сохранением прозрачности (PHP)

06 Марта 2012 года

Записываю решение на память.

Всем нам иногда приходится ресайзить картинки на сервере, и у любого 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);
}

Вуаля. Теперь черный фон появляться не должен.

Камменты

Андрей21.08.2012, 13:12#
Украл, но не понял что украл. Еще и не верно)))
Дуброн самый21.08.2012, 14:23#
"Украл" - это все-таки слишком громкое слово, а в посте прямо указано, "нашел в Яндексе" =) И скорее всего как-то адаптировал, хотя уже не помню, давно было.

Протестил, этот код действительно работает только на половину - черный фон убивает, но альфу не сохраняет. Ок, поковыряюсь на досуге, чтоб людей не заблуждать.

Написать коммент: памятка постеру

 

Последне камменты

18.11.2017  JohnКак закрыть окно Skype / свернуть нафиг в трэй: Спасибо, добрый человек! Неимоверно раздражало.
10.11.2017  NikПочему не работает form.submit(): Автор, спасибо за статью 5-летней давности. Подари...
27.10.2017  ДенисОбработка кликов и цели в Яндекс.Метрике, улучшенный вариант: Блин. А для не в зуб ногой - можно код целиком выл...
17.10.2017  ДубрDenwer - настройка алиасов (ServerAlias): Ахуенно не это, ахуенно то что кто-то пользуется Д...
29.09.2017  Maxтам же: Спасибо, чувак! Это ахуенно, оно заработало!!!

Статсы