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

27.06.2012 · 37 камментов · рейтинг 11.83
28.04.2008 · 44 каммента · рейтинг 9.63
23.01.2013 · 20 камментов · рейтинг 9.22
06.03.2008 · 29 камментов · рейтинг 7.76
19.01.2008 · 20 камментов · рейтинг 6.4

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

22.07.2017  СергейПочему не работает form.submit(): Также столкнулся с неработающим .submit() при отпр...
20.07.2017  СергейСвязь: Здравствуйте. Хочу предложить Вам тройной обмен п...
17.07.2017  Илья АрхипкинСколько журналистов в России?: Мне рассказывали как журналисты освещали акцию в К...
21.05.2017  Vadim GukОбработка кликов и цели в Яндекс.Метрике, улучшенный вариант: Большое спасибо за решение задачи.
20.05.2017  ДмитрийТестовое задание для PHP-программиста (Junior): А джуны ещё нужны у вас в компании?

Статсы