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#
"Украл" - это все-таки слишком громкое слово, а в посте прямо указано, "нашел в Яндексе" =) И скорее всего как-то адаптировал, хотя уже не помню, давно было.

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

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

 

Крутые посты wtf??? →

28.04.2008 · 44 каммента · рейтинг 7.6
15.02.2013 · 24 каммента · рейтинг 6.79
06.03.2008 · 29 камментов · рейтинг 6.14
29.08.2007 · 28 камментов · рейтинг 5.93
30.01.2013 · 13 камментов · рейтинг 4.99

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

Статсы