Znak wodny do uploadu zdjęć [php]


(Song) #1

Witam zaczynam programować w php.

Mój problem polega na tym otóż mam taki ajaksowy sktypt do uploadu zdjęć.

Chciałbym dodać żeby po uploadzie zdjęcia wyświetlało mi znak wodny mam taki kod:

<?php

include('db.php');

session_start();

$session_id='1'; //$session id

$path = "uploads/";

$main_img = $_GET['src']; // obrazek, na ktory zostanie nałozony znak wodny

$watermark_img	= "znak.png"; // GIF, PNG lub JPG (bez przezroczystosci)

$padding = 3; // odleglosc znaku wodnego od ramki obrazka

$opacity = 100;	// przezroczystosc znaku wodnego



	$valid_formats = array("jpg", "png", "gif", "bmp");

	if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST")

		{

			$name = $_FILES['photoimg']['name'];

			$size = $_FILES['photoimg']['size'];


			if(strlen($name))

				{

					list($txt, $ext) = explode(".", $name);

					if(in_array($ext,$valid_formats))

					{

					if($size<(1024*1024))

						{

							$actual_image_name = time().substr(str_replace(" ", "_", $txt), 5).".".$ext;

							$tmp = $_FILES['photoimg']['tmp_name'];

							if(move_uploaded_file($tmp, $path.$actual_image_name))

								{

								mysql_query("UPDATE users SET profile_image='$actual_image_name' WHERE uid='$session_id'");


			echo "";

								}




							else

								echo "failed";

						}

						else

						echo "Maksymalny rozmiar 1 MB";					

						}

						else

						echo "Zły format ..";	

				}


			else

				echo "Please select image..!";


			exit;

		}




//funkcja do przezroczystosci obrazka w PNG / GIF

function setTransparency($new_image,$image_source) 

    {

            $transparencyIndex = imagecolortransparent($image_source); 

            $transparencyColor = array('red' => 255, 'green' => 255, 'blue' => 255); 


            if ($transparencyIndex >= 0) { 

                $transparencyColor = imagecolorsforindex($image_source, $transparencyIndex);    

            } 


            $transparencyIndex = imagecolorallocate($new_image, $transparencyColor['red'], $transparencyColor['green'], $transparencyColor['blue']); 

            imagefill($new_image, 0, 0, $transparencyIndex); 

             imagecolortransparent($new_image, $transparencyIndex);    

    } 


$filetype = substr($main_img,strlen($main_img)-4,4);

$filetype = strtolower($filetype);


if($filetype == ".gif") { //sprawdzenie czy obrazek jest gifem

header('Content-Type: image/gif');

$fn=fopen($main_img,"r"); 

fpassthru($fn); 

}

else {


$watermark_size = getimagesize($watermark_img);

$watermark_width = $watermark_size[0];  

$watermark_height = $watermark_size[1]; 


// Załadowanie znaku wodnego

$watermark = imagecreatefromstring(file_get_contents($watermark_img));

imagealphablending($watermark, false);

imagesavealpha($watermark, true); 


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

setTransparency($new_image, $watermark); 

imagecopyresampled($new_image, $watermark, 0, 0, 0, 0, $watermark_width, $watermark_height, $watermark_width, $watermark_height); 


$image = imagecreatefromstring(file_get_contents($main_img));


if(!$image || !$new_image) die("Błąd! Obrazek lub znak wodny nie mógł zostać wyświetlony!"); 


$image_size = getimagesize($main_img);  

$dest_x = $image_size[0] - $watermark_width - $padding;  

$dest_y = $image_size[1] - $watermark_height - $padding;


// wklejenie znaku wodnego na obrazek

imagecopymerge($image, $new_image, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $opacity);


// wyswietlenie obrazka ze znakiem wodnym

header("content-type: image/jpg");   

imagejpeg($image);  

imagedestroy($image);  

imagedestroy($new_image);  


}

?>[/code]

I nie chce mi wyświetlać znaku wodnego skrypt jest z tąd.

http://www.9lessons.info/2011/08/ajax-imag...refreshing.html


(Konrad Kosowski) #2

Nie dostajesz czasem warninga Headers already sent?


(Song) #3

Jest Warn

Znacie może co zrobić aby było dobrze ?


(Konrad Kosowski) #4

No ale Ty masz już błędy na poziome uploadu pliku…

błąd jest tutaj:

if(move_uploaded_file($tmp, $path.$actual_image_name))[/code]



Sprawdź czy istnieją katalogi, do których próbujesz zapisać oraz czy masz w nich prawa zapisu.

(Song) #5

Teraz jest ok było tak jak pisałeś nie było katalogów ale znak wodny nie działa.

Jak dokleić do tego skryptu znak wodny ?

Tu daje czysty kod pliku ajaximage.php tamten był zmodyfikowany prze zemnie

<?php

include('db.php');

session_start();

$session_id='1'; //$session id

$path = "uploads/";


	$valid_formats = array("jpg", "png", "gif", "bmp");

	if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST")

		{

			$name = $_FILES['photoimg']['name'];

			$size = $_FILES['photoimg']['size'];


			if(strlen($name))

				{

					list($txt, $ext) = explode(".", $name);

					if(in_array($ext,$valid_formats))

					{

					if($size<(1024*1024))

						{

							$actual_image_name = time().substr(str_replace(" ", "_", $txt), 5).".".$ext;

							$tmp = $_FILES['photoimg']['tmp_name'];

							if(move_uploaded_file($tmp, $path.$actual_image_name))

								{

								mysql_query("UPDATE users SET profile_image='$actual_image_name' WHERE uid='$session_id'");


									echo "";

								}

							else

								echo "failed";

						}

						else

						echo "Image file size max 1 MB";					

						}

						else

						echo "Invalid file format..";	

				}


			else

				echo "Please select image..!";


			exit;

		}

?>[/code]

(Konrad Kosowski) #6

Musisz się zdecydować, czy plik ma być od razu wyświetlany (przekazywany do przeglądarki), czy zapisywany w folderze i serwowany później. Problem polega na tym, że tutaj:

echo ".$actual_image_name."'  class='preview'"; 

Już wyświetlasz coś, więc php śle nagłówki. Natomiast na końcu kodu do generowania watermarka masz takie coś:

("content-type: image/jpg");   //zwraca nagłówek z content type image/jpg (a przecież już wcześniej poszły nagłówki!)imagejpeg($image);  // próbuje przekazać obrazek. Nie uda się nagłówki się nie zgadzają. Ale tutaj uwaga. imagejpeg jako drugi argument może przekazywać path do miejsca, w którym należy zapisać plik.imagedestroy($image);  //zwalnia pamięćimagedestroy($new_image); //zwalnia pamięc[/code]



Najlepiej więc dodać w drugim parametrze imagejpeg ścieżkę do zapisu pliku.

(Song) #7

Czyli w tej sytuacji mam to wkleić ? Na pewno chce żeby obrazek wyświetlał się od razu ze znakiem wodnym.

Sory ale nie znam zbyt dobrze PHP.


(Konrad Kosowski) #8

Ale od razu po załadowaniu obrazka jako content type image, czy później, jako ?


(Song) #9

Od razu najlepiej przy wyświetlaniu, ewentualnie jeśli jest szybsza metoda to może być jako ważne aby było, męczę się już z tym 2 dni . Szukałem rozwiązań u wujka Google ale nic z tego, będę wdzięczny jeśli mi pomożesz :slight_smile:


(Konrad Kosowski) #10

Nie testowałem, ale wydaje mi się, że będzie dobrze:

    <?php('db.php');    session_start();    $session_id='1'; //$session id    $path = "uploads/";    $path_watermarked = "watermarked/";    $main_img       = $_GET['src']; // obrazek, na ktory zostanie nałozony znak wodny    $watermark_img   = "znak.png"; // GIF, PNG lub JPG (bez przezroczystosci)    $padding       = 3; // odleglosc znaku wodnego od ramki obrazka    $opacity      = 100;   // przezroczystosc znaku wodnego

(Song) #11

Niestety nie działa nie ma żadnego błędu a wetermarked się nie wkleja co zrobić?


(Konrad Kosowski) #12

$PATH_TO_WATERMARK zaktualizowałeś ten fragment, czy copy/paste i już?

Masz gdzieś demo tego?


(Song) #13

Za aktualizowałem demo podałem na górze


(Konrad Kosowski) #14

Moim zdaniem powinieneś wrócić z pytaniami o watermarkowanie zdjęć w momencie gdy ogarniesz konstrukcję if - else. To podstawa, przedszkole wręcz, a masz tutaj braki. Omijając ten krok i próbując wskoczyć na głęboką będziesz tylko marnował swój czas, a co gorsza - marnował czas innych.

Problem kolejny raz jest w move_uploaded_file($tmp, $path.$actual_image_name). Funkcja ta zwraca false, dlatego pojawia się failed. Popraw.