2009-12-04

Маска, маска я тебя знаю

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

Почемуто в GD нет функций для работы с масками. Пришлось изобретать самим, и вот что получилось:

Так выглядит код маскирования:

$image = imagecreatefromgif('image.gif');
$mask = imagecreatefromgif('mask.gif');

$dest = imagecreatetruecolor(imagesx($image),imagesy($image));

imagemask($dest,$image,$mask);

header('Content-type: image/jpeg');
imagepng($dest);

Код самой функции маскирования:

function imagemask($dest,$image,$mask){
	$width =  imagesx($image);
	$height = imagesy($image);
	
	$tc = imagecolorallocate($dest,0,0,0);
	imagecolortransparent($dest,$tc);
	
	for($i=0;$i<$width;$i++){
		for($j=0;$j<$height;$j++){
			$c = imagecolorat($image,$i,$j);
			$color = imagecolorsforindex($image,$c);
			
			$c = imagecolorat($mask,$i,$j);
			$mcolor = imagecolorsforindex($mask,$c);
			
			if (!($mcolor['red']==255 && $mcolor['green']==255 && $mcolor['blue']==255)){
				$c = imagecolorallocate($dest,$color['red'],$color['green'],$color['blue']);
				imagesetpixel($dest,$i,$j,$c);
			} 
		}
	}
}

Правда расстраивает, что GD так и не научилась работать нормально с полупрозрачностью - если кто знает способ, расскажите плиз.

 

комментарии:

 
Михаил (анонимный пользователь) | 2010-02-27
не скажу как gif в GD, но ImageMagick запросто накладывает маску для картинок png, сохраняя прозрачности, может пригодится: $mask = new Imagick(); $mask->readImage('mask.png'); $image = new Imagick(); $image->readImage('image.png'); $mask->compositeImage($image, imagick::COMPOSITE_IN, 0, 0); $mask->writeImage('result.png');

 

Для того чтобы каждый раз не представляться можно войти как зарегистрированный пользователь.

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться