Центриране на воден знак

Msecurity

Registered
Добро утро колеги :P
Как да центрирам водният знак и по възможност да се преоразмерява според изображението на което се поставя...
Играх си над 3 часа да експериментирам ... на 2 картинки е в центъра ... на следващите 2 в ъгъла и т.н и не става и не става...

Ето кода който използвам - нищо сложно не е.... нооо :

PHP:
<?php
$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));
$w = imagesx($image);
$h = imagesy($image);
$watermark = imagecreatefrompng('mark.png');
$ww = imagesx($watermark);
$wh = imagesy($watermark);
imagecopymerge($image, $watermark, (($w/2)/($ww/2)), (($h/2)/($wh/2)), 0, 0, $ww, $wh, 10);
header('Content-type: image/jpeg');
imagejpeg($image,null,100);
exit();
?>
Предполагам че още 2 реда код му трябва макс. ноо като си нямам и на идея как трябва да стане ... изчетох половината интернет и все нещи куцаше :D
Мерси предварително :P
 
Я виж така дали ще стане :)
PHP:
<?php
$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));
$watermark = imagecreatefrompng('mark.png');
$wx = imagesx($image)/2 - imagesx($watermark)/2;
$wy = imagesy($image)/2 - imagesy($watermark)/2;
 
imagecopy($image, $watermark, $wx, $wy, 0, 0, imagesx($watermark), imagesy($watermark));
header('Content-type: image/jpeg');
imagejpeg($image,null,100);
exit();
?>
 
Така стана, но как може да се преоразмерява автоматично според изображението - защото на някои е окей , но на по малките е само част от водният знак, тъи като е по голям от него?
И още един глупав въпрос има ли как да го огранича - да проспуска да го слага на някои изображения че ми маркира дори хедъра на сайта в воден знак :D
 
PHP:
<?php
function resize_image($file, $w, $h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($r-$w/$h)));
        } else {
            $height = ceil($height-($height*abs($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
    $src = imagecreatefromjpeg($file);
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $dst;
}
$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));
$image = resize_image($image, 200, 200);
$watermark = imagecreatefrompng('mark.png');
$wx = imagesx($image)/2 - imagesx($watermark)/2;
$wy = imagesy($image)/2 - imagesy($watermark)/2;
 
imagecopy($image, $watermark, $wx, $wy, 0, 0, imagesx($watermark), imagesy($watermark));
header('Content-type: image/jpeg');
imagejpeg($image,null,100);
exit();
?>
 
Msecurity каза:
Така стана, но как може да се преоразмерява автоматично според изображението - защото на някои е окей , но на по малките е само част от водният знак, тъи като е по голям от него?
И още един глупав въпрос има ли как да го огранича - да проспуска да го слага на някои изображения че ми маркира дори хедъра на сайта в воден знак :D
По-нагоре ти написах функциика само виж дали работи като хората и си настрой преоразмеряването (200 - 200)! Тааа за пропускането зависи по какъв параметър ще го правиш! Смисъл ако ще е по вече поставен хедър ще ти е нужен OCR софтуер да разпознава кога го има и кога не :)
 
Хммм нещо не става ... не се показва водният знак и дава грешки
Код:
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /home/motoibgc/public_html/******/test.php on line 22

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'Resource id #3' is not a valid JPEG file in /home/motoibgc/public_html/*****/test.php on line 22

Warning: imagecreatefromgif() [function.imagecreatefromgif]: 'Resource id #3' is not a valid GIF file in /home/motoibgc/public_html/******/test.php on line 23
Добавих 3 реда за още няколко формата, но jpg въобще не го отразява като формат?!?
Код:
	if($src = imagecreatefromgif($file));
if($src = imagecreatefrompng($file));
 
Пролвай така, но ме съмнява, че това се получава защото ползваш

$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));


вместо просто да извикаш снимката

$imgFile = "1.jpg"; примерно или $imgFile = "1.png";

PHP:
<?php
function resize_image($file, $w, $h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($r-$w/$h)));
        } else {
            $height = ceil($height-($height*abs($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
	if(preg_match("/(.*?)\.png/",$file))
	{
		$src = imagecreatefrompng($file);
	}
	else if(preg_match("/(.*?)\.jpg/",$file))
	{
		$src = imagecreatefromjpeg($file);
	}
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $dst;
}
$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));
$image = resize_image($image, 200, 200);
$watermark = imagecreatefrompng('mark.png');
$wx = imagesx($image)/2 - imagesx($watermark)/2;
$wy = imagesy($image)/2 - imagesy($watermark)/2;
 
imagecopy($image, $watermark, $wx, $wy, 0, 0, imagesx($watermark), imagesy($watermark));
header('Content-type: image/jpeg');
imagejpeg($image,null,100);
exit();
?>
 
Пробвах и така както каза ... и пак няма ефект и пак дава грешки ето в тази част от кода

Код:
        if(preg_match("/(.*?)\.png/",$file))
        {
                $src = imagecreatefrompng($file);
        }
        else if(preg_match("/(.*?)\.jpg/",$file))
        {
                $src = imagecreatefromjpeg($file);
        }
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
Ето този път каква грешка дава...
Warning: preg_match() expects parameter 2 to be string, resource given in ....
Warning: imagecopyresampled(): supplied argument is not a valid Image resource in ......
 
Получава се това защото $file трябва да е стринг, а по начина по който взимаш снимката не се получава!
$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));
 
dakata__92 каза:
Получава се това защото $file трябва да е стринг, а по начина по който взимаш снимката не се получава!
$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));
Пробвах по 1000 начина и никакъв ефект...
Ще може ли дадеш малък пример?
 
И хоп същите грешки...
Warning: preg_match() expects parameter 2 to be string, resource given in /home/motoibgc/public_html/*********/test.php on line 22

Warning: preg_match() expects parameter 2 to be string, resource given in /home/motoibgc/public_html/*********/test.php on line 26

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /home/motoibgc/public_html/*********/test.php on line 31
 
Провери този урок за идеи :)

http://phppot.com/php/php-image-resize/ (не е реклама)
http://www.w3bees.com/2013/03/resize-image-while-upload-using-php.html
(не е реклама)
 
Хммм а някаква идея как да слага воден знак само на изображения от дадена директория?
например images/ и всички файлове от нея и от подпаките?
 
Msecurity каза:
Хммм а някаква идея как да слага воден знак само на изображения от дадена директория?
например images/ и всички файлове от нея и от подпаките?
Така ще изведеш всяка снимка в директорията която си подал! Във foreach спокойно можеш да поставиш кода за поставяне на воден знак който вече, показа! Така на всяка снимка в директорията ще сложиш воден знак но трябва да направиш проверка дали файла е изображение понеже сканираш директорията като цяло.
PHP:
<?php
$directory = 'smiles/'; // your directory

$files  = scandir( $directory );

foreach( $files as $file )
{
	echo "<br><img src='$directory".$file."' />";
}
?>

Може да ползваш и glob(), като подадеш gif, jpg, png
http://www.w3schools.com/php/func_filesystem_glob.asp
PHP:
<?php
$directory = 'smiles/'; // your directory
$files = glob($directory."*.gif");

foreach( $files as $file )
{
	echo "<br><img src='".$file."' />";
}

?>
 
dakata__92 каза:
Msecurity каза:
Хммм а някаква идея как да слага воден знак само на изображения от дадена директория?
например images/ и всички файлове от нея и от подпаките?
Така ще изведеш всяка снимка в директорията която си подал! Във foreach спокойно можеш да поставиш кода за поставяне на воден знак който вече, показа! Така на всяка снимка в директорията ще сложиш воден знак но трябва да направиш проверка дали файла е изображение понеже сканираш директорията като цяло.
PHP:
<?php
$directory = 'smiles/'; // your directory

$files  = scandir( $directory );
$images = array();

foreach( $files as $file )
{
	echo "<br><img src='$directory".$file."' />";
}
?>

Не става... все още маркира всичко ... :(
 
dakata__92 каза:
Докато си писал си редактирах поста отгоре! Погледни го.
http://php.net/manual/en/function.glob.php

Пак не става... тоя скрипт вече сер. започва да се е*ава с мен
 
Msecurity каза:
dakata__92 каза:
Докато си писал си редактирах поста отгоре! Погледни го.
http://php.net/manual/en/function.glob.php

Пак не става... тоя скрипт вече сер. започва да се е*ава с мен
Кое не става? Обоснови отговора си? Кое е проблемното и за кой от всичките кодове за които пита става на въпрос?
 
Ето го кода , но все маркира всички изображения ... логота, хеадъри и т.н, а те са във отделна папка :@
Код:
<?php
$directory = 'products/'; // your directory
$files = glob($directory."*.jpg");
foreach( $files as $file )
{   
$path =  $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
$image = imagecreatefromstring(file_get_contents($path));
$img_w = imagesx($image);
$img_h = imagesy($image);
$filetype = strtolower($filetype);
if($filetype == ".gif") $image = @imagecreatefromgif($img);
if($filetype == ".jpg") $image = @imagecreatefromjpeg($img);
if($filetype == ".png") $image = @imagecreatefrompng($img);
if($filetype == ".jpeg") $image = @imagecreatefromjpeg($img);
if (!$image) die();
if($img_w>990)$watermark = @imagecreatefrompng('pictures/watermark/watermark1000.png');
else if($img_w>790)$watermark = @imagecreatefrompng('pictures/watermark/watermark800.png');
else if($img_w>590)$watermark = @imagecreatefrompng('pictures/watermark/watermark600.png');
else if($img_w>390)$watermark = @imagecreatefrompng('pictures/watermark/watermark400.png');
else if($img_w>190)$watermark = @imagecreatefrompng('pictures/watermark/watermark200.png');
else $watermark = @imagecreatefrompng('pictures/watermark/watermarkmini.png');
$wx = imagesx($image)/2 - imagesx($watermark)/2;
$wy = imagesy($image)/2 - imagesy($watermark)/2;

imagecopy($image, $watermark, $wx, $wy, 0, 0, imagesx($watermark), imagesy($watermark));
header('Content-type: image/jpeg');
imagejpeg($image,null,100);
exit();
}
?>
 

Back
Горе