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??? →

02.10.2012 · 90 камментов · рейтинг 19.76
27.06.2012 · 37 камментов · рейтинг 12.32
15.02.2013 · 22 каммента · рейтинг 10.19
06.03.2008 · 29 камментов · рейтинг 7.93
28.03.2008 · 23 каммента · рейтинг 7.08

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

18.04.2017  ДубрОбработка кликов и цели в Яндекс.Метрике, улучшенный вариант: Вячеслав, блин, я там скобку потерял =) Обновил, ...
17.04.2017  Вячеславтам же: вот http://www.totalat.ru/service/remont-akpp-bmw/
17.04.2017  Вячеславтам же: Вашу версию вставил. Даже alert проверочный вывод...
17.04.2017  Вячеславтам же: То что вы там запостили это вместо последнего куск...
17.04.2017  Дубртам же: Привет! 1) код лучше запостить куда-нибудь на ht...

Статсы