Autor Zpráva
Hologos
Profil
Zdravím,
potřebuji pomoct se skriptem, který se stará o vytvoření vodoznaku.

Mám tento kód:
<?php
....

list($width, $height, $type, $attr) = getimagesize($photo_path);
$update_photo = mysql_query("UPDATE `photos` SET `ext` = '".$extension."', `width` = '".$width."', `height` = '".$height."' WHERE `id_photo` = '".$lastid."'");

$watermark = './gfx/watermark3.png';
$imagesize_watermark = getimagesize($watermark);

switch($extension)
{
	case 'jpg': $image = imagecreatefromjpeg($photo_path); break;
	case 'png': $image = imagecreatefrompng($photo_path); break;
	case 'gif': $image = imagecreatefromgif($photo_path); break;
}


if ($imagesize_watermark && $imagesize_watermark[2] <= 3) {
	$img_watermark = imagecreatefrompng($watermark);
	imagecopymerge($image, $img_watermark, 5, imagesy($image) - $imagesize_watermark[1] - 5, 0, 0, $imagesize_watermark[0], $imagesize_watermark[1], 50); // <---
	switch($extension)
	{
		case 'jpg': $saved_photo = imagejpeg($image, $photo_path); break;
		case 'png': $saved_photo = imagepng($image, $photo_path); break;
		case 'gif': $saved_photo = imagegif($image, $photo_path); break;
	}

	if($saved_photo)
	{
		echo '<div id="success">Fotografie byla úspěšně přidána.<br />Vodoznak byl úspěšně aplikován.</div>';
	}
	else
	{
		echo '<div id="success">Fotografie byla úspěšně přidána.</div>';
		echo '<div id="error" style="margin-top: 5px">Vodoznak se nepodařilo aplikovat.</div>';
	}
}

unset($_POST);
unset($_FILES);

....
?>


Na řádce s šipkou je příkaz, který sloučí oba obrázky - poslední parametr je průhlednost.
Ať měním parametr jak chci (<0, 100>), tak výsledek nevypadá, jak by měl.

Soubory:
vodoznak - http://img139.imageshack.us/img139/7990/watermark3.png
fotka - http://img295.imageshack.us/img295/6114/testdh.jpg
výsledná fotka - http://img219.imageshack.us/img219/6659/90741166.jpg
chci, aby vypadala takto - http://img339.imageshack.us/img339/316/vysledek.jpg

Poraďte, prosím, zda-li dělám něco špatně. Nebo můžete navrhnout jiný (funkční) postup.
Toto je především kostra ze skriptu od Jakuba Vrány.
Děkuji
Keeehi
Profil
Podívejte se, co napsali lidé dole pod tuto funkci v manuálu. Je tam několik řešení vašeho problému. (klíčové slovo pro hledání je "alpha")
Nebo se můžete pokusit vyřešit sám s pomocí funkce imagecolorallocatealpha()
Hologos
Profil
Děkuji, v diskuzi pod funkcí jsem našel tuto funkci:

function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
	if(!isset($pct)){
		return false;
	}
	$pct /= 100;
	// Get image width and height
	$w = imagesx( $src_im );
	$h = imagesy( $src_im );
	// Turn alpha blending off
	imagealphablending( $src_im, false );
	// Find the most opaque pixel in the image (the one with the smallest alpha value)
	$minalpha = 127;
	for( $x = 0; $x < $w; $x++ )
		for( $y = 0; $y < $h; $y++ ){
			$alpha = ( imagecolorat( $src_im, $x, $y ) >> 24 ) & 0xFF;
			if( $alpha < $minalpha ){
				$minalpha = $alpha;
			}
		}
	//loop through image pixels and modify alpha for each
	for( $x = 0; $x < $w; $x++ ){
		for( $y = 0; $y < $h; $y++ ){
			//get current alpha value (represents the TANSPARENCY!)
			$colorxy = imagecolorat( $src_im, $x, $y );
			$alpha = ( $colorxy >> 24 ) & 0xFF;
			//calculate new alpha
			if( $minalpha !== 127 ){
				$alpha = 127 + 127 * $pct * ( $alpha - 127 ) / ( 127 - $minalpha );
			} else {
				$alpha += 127 * $pct;
			}
			//get the color index with new alpha
			$alphacolorxy = imagecolorallocatealpha( $src_im, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha );
			//set pixel with the new color + opacity
			if( !imagesetpixel( $src_im, $x, $y, $alphacolorxy ) ){
				return false;
			}
		}
	}
	// The image copy
	imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
}


Funguje bez chyby a stejně se používá.
Díky.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0