Hoi,

ik ben bezig met een watermark op afbeeldingen te plaatsen. Dit lukt goed, enkel vervormd het soms door de grootte van de afbeeldingen.
Nu zou ik willen dat ik enkel aan de afbeeldingen een width meegeef.
Van zodra ik maar 1 variable meegeef, geeft dit een foutmelding. Hoe los ik dit het beste op?

<?php
// function die de image verkleint/vergroot en naar een specifieke locatie kopieert.
class image_watermark
{

// function die een afbeelding inlaad als image

function set_image($filename)
{
if (file_exists($filename))
{
$image_info = getimagesize($filename);

switch ($image_info["mime"])
{
case "image/jpeg" : $this->image = imagecreatefromjpeg($filename); break;
case "image/png" : $this->image = imagecreatefrompng($filename); break;
case "image/gif" : $this->image = imagecreatefromgif($filename); break;
default : echo "Error: Er is geen jpeg, png of gif afbeelding gebruikt!"; end; break;
}
}
else
{
echo "error: " . $filename . " does not exist!";
end;
}
}

// function die een afbeelding inlaad als watermark

function set_watermark($filename)
{
if (file_exists($filename))
{
$image_info = getimagesize($filename);

switch ($image_info["mime"])
{
case "image/jpeg" : $this->watermark = imagecreatefromjpeg($filename); break;
case "image/png" : $this->watermark = imagecreatefrompng($filename); break;
case "image/gif" : $this->watermark = imagecreatefromgif($filename); break;
default : echo "Error: Er is geen jpeg, png of gif afbeelding gebruikt!"; end; break;
}
}
else
{
echo "error: " . $filename . " does not exist!";
end;
}
}

// function die de image verkleint/vergroot en naar een specifieke locatie kopieert.

function push($destination, $width, $height, $options)
{

if($width==0) {$width=imagesx($this->image); $height=imagesy($this->image); }

$image = imagecreatetruecolor($width, $height);

imagecopyresampled($image, $this->image, 0, 0, 0, 0, $width, $height, imagesx($this->image), imagesy($this->image));

if($options["watermark"]==true)
{
$percentage = imagesx($this->watermark) / $width;

$watermark_width = imagesx($this->watermark) / $percentage;
$watermark_height = imagesy($this->watermark) / $percentage;
$watermark_top = $options["top"] - ($watermark_height / 2);

$watermark = imagecreatetruecolor($watermark_width, $watermark_height);

imagecopyresampled($watermark, $this->watermark, 0, 0, 0, 0, $watermark_width, $watermark_height, imagesx($this->watermark), imagesy($this->watermark));

$transparant = imagecolorallocate($watermark, 255, 0, 255); // Een kleurtje kiezen welke we transparant gaan maken
imagefill($watermark, 0, 0, $transparant); // De afbeelding volgieten met deze kleur
imagecolortransparent($watermark, $transparant); // Aangeven dat we onze gekozen kleur als transparant willen zien
// sterke/zichtbaar van het watermerk kun je hieronder instellen,het laatste getal geeft het aan in procenten 100 = volledig zichtbaar, 0 = onzichtbaar
imagecopymerge ($image, $watermark, 0, $watermark_top, 0, 0, $watermark_width, $watermark_height,80);
}

imagejpeg ($image, $destination);
}
}

// class aanroepen

$watermark = new image_watermark;

// afbeelding en watermerk inladen, let erbij op dat het watermerk de kleur #FF00FF als achtergrond heeft.
// let er ook op dat de afbeelding geen anti-aliasing gebruik, hierbij neemt een object een deel van de kleur van zijn achtergrond over,
// waardoor er bij de mengin ook een kleur word getoond en dit resulteerd in lelijke effecten.

$file = $_FILES;

if($_FILES['foto']['name'])
{
$watermark->set_image($file[foto][tmp_name]);
$watermark->set_watermark("../../temp/water.png");
$pushname = $bevestig . md5(time()+1) . ".jpg";
$watermark->push("../../pics/" . $pushname, $width, $height, array("watermark" => true, "top" => "20"));
$watermark->push("../../tumbs/" . $pushname, $width, $height, array("watermark" => true, "top" => "20"));
}
?>
Wil je height een standaard waarde geven?

<?php

function push($destination, $width, $height = 50, $options)

?>
Reshad F op 25/01/2014 15:31:32

Wil je height een standaard waarde geven?

<?php

function push($destination, $width, $height = 50, $options)

?>

Dit geeft geen verandering. De foto blijft de ware grootte behouden van de upload.

Jouw regel 57 veranderen:
<?php
if ($width == 0) {
	$width = round($this->src_w * ($height / $this->src_h));
}
elseif ($height == 0) {
	$height = round($this->src_h * ($width / $this->src_w));
}
//src_w en src_h maak je dan als property ipv van telkens opvragen met imagesx/y()
?>
Wat bedoel je met dit Ger van Steenderen?
//src_w en src_h maak je dan als property ipv van telkens opvragen met imagesx/y()
Zeg maar gewoon Ger hoor ;-)

Wat ik bedoel dat je herhaaldelijk gebruik maakt van dezelfde functies nl. imagesx en imagesy.
Het is makkelijker om dit in een property van je object op te slaan, bijv in de functie set_image().

En dan nog even dit:
<?php
$watermark = new image_watermark()
$waternark->set_image($_FILES['foto']['tmp_name'], $_files['foto']['name']);
$watermark->image = 'haha gefopt';
$watermark->push("../../pics/" . $pushname, $width, $height, array("watermark" => true, "top" => "20"));
?>

Je hebt de property image van object niet vooraf gedeclareerd maar maakt hem on the fly aan, en daarmee is ie altijd public, dus kan ik er buiten de class om mee doen wat ik wil.

Reageren