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 · 92 каммента · рейтинг 17.46
27.06.2012 · 37 камментов · рейтинг 10.84
06.03.2008 · 29 камментов · рейтинг 7.38
29.08.2007 · 28 камментов · рейтинг 7.08
28.03.2008 · 24 каммента · рейтинг 6.73

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

31.07.2018  ДубрНаконец-то, нормальная работа с LESS в NetBeans: Sergio, вообще NetBeans кажется предлагал компилит...
18.07.2018  яндекс диск моя страницаНовый Яндекс.Браузер - браузер "Yandex" (отзыв / обзор): всем рекомендую
24.06.2018  SergioСвязь: Уважаемое автор. Прочитал статью про NetBeans и ...
21.06.2018  SergioНаконец-то, нормальная работа с LESS в NetBeans: Уважаемое "дупло"(автор). Как включить LESS в Net...
12.04.2018  SlowpokeИщем PHP-программиста, Москва, 40.000: Вакансия еще актуальна? Хотел бы попробовать свои ...

Статсы