Znak wodny do uploadu zdjęć [php]

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

Nie dostajesz czasem warninga Headers already sent?

Jest Warn

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

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.

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]

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.

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.

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

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:

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

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

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

Masz gdzieś demo tego?

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

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.