Php - upload, resize, watermark

Napravio sam malo skripticu koja radi upload, resize i postavlja na kraju watermark na fotografiju.
Jedan od uslova je da ime fotografije mora ostati nepromjenjeno i da može sadržati velika/mala slova te čćžšđ, i da na kraju svega treba biti snimljena kao .jpg (mala slova jpg)

Pojavila su mi se dva problema koja nikako ne mogu da riješim:

  1. Ukoliko fotografija u imenu ima slova čćžšđ nije problem, međutim ako je neko od tih slova na prvom mijestu i veliko ČĆŽŠĐ skripta ga jednostavno izbriše.

  2. Ako je odabrana fotografija u .JPG formatu (veliko JPG) watermark se ne postavi na nju. Ovo je kod koji koristim:

     if(isset($_FILES['image'])){
         $errors= array();
         foreach($_FILES['image']['tmp_name'] as $key => $tmp_name ){
             $file_name =$_FILES['image']['name'][$key];
             $file_size =$_FILES['image']['size'][$key];
             $file_tmp =$_FILES['image']['tmp_name'][$key];
             $file_type=$_FILES['image']['type'][$key];  
     		    // get file extension
                 $fileType = strtolower(pathinfo($file_name, PATHINFO_EXTENSION)); 
                 // get filename without extension
                 $fileNewName = pathinfo($file_name, PATHINFO_FILENAME);
                 $watermarkImagePath = 'images/watermark.png'; 
     			$folderPath = "images/upload/";
     			$sourceProperties = getimagesize($file_tmp);
     	        $imageType = $sourceProperties[2];
     			
     			// Resize code
     			switch ($imageType) {
                 case IMAGETYPE_PNG:
                     $imageResourceId = imagecreatefrompng($file_tmp); 
                     $targetLayer = imageResize($imageResourceId,$sourceProperties[0],$sourceProperties[1]);
                     imagepng($targetLayer,$folderPath. $fileNewName. ".jpg");
                     break;
                 case IMAGETYPE_GIF:
                     $imageResourceId = imagecreatefromgif($file_tmp); 
                     $targetLayer = imageResize($imageResourceId,$sourceProperties[0],$sourceProperties[1]);
                     imagegif($targetLayer,$folderPath. $fileNewName. ".jpg");
                     break;
                 case IMAGETYPE_JPEG:
                     $imageResourceId = imagecreatefromjpeg($file_tmp); 
                     $targetLayer = imageResize($imageResourceId,$sourceProperties[0],$sourceProperties[1]);
                     imagejpeg($targetLayer,$folderPath. $fileNewName. ".jpg");
                     break;
                 default:
                     echo "Invalid Image type.";
                     exit;
                     break;
             }   
     		// watermark
     		   
     		        $targetFilePath = $folderPath . $file_name; 
                     $watermarkImg = imagecreatefrompng($watermarkImagePath); 
     				
                     switch($fileType){ 
                         case 'jpg': 
                             $im = imagecreatefromjpeg($targetFilePath); 
                             break; 
     					case 'JPG': 
                             $im = imagecreatefromjpeg($targetFilePath); 
                             break; 
                         case 'jpeg': 
                             $im = imagecreatefromjpeg($targetFilePath); 
                             break; 
                         case 'png': 
                             $im = imagecreatefrompng($targetFilePath); 
                             break; 
                         default: 
                             $im = imagecreatefromjpeg($targetFilePath); 
                     } 
                      
                     $marge_right = 1; 
                     $marge_bottom = 1; 
                      
                     $sx = imagesx($watermarkImg); 
                     $sy = imagesy($watermarkImg); 
                      
                     imagecopy($im, $watermarkImg, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($watermarkImg), imagesy($watermarkImg)); 
                      
                     imagejpeg($im, $targetFilePath,70); 
                     imagedestroy($im); 
          
                   
         }
          echo ' Uspješan upload';
     }
     function imageResize($imageResourceId,$width,$height) {
     if($width > $height){
         $targetWidth=1000;
         $targetHeight=($height/$width)*$targetWidth;
     } else {
         $targetHeight=1000;
     $targetWidth=($width/$height)*$targetHeight;}
         $targetLayer=imagecreatetruecolor($targetWidth,$targetHeight);
         imagecopyresampled($targetLayer,$imageResourceId,0,0,0,0,$targetWidth,$targetHeight, $width,$height);
         return $targetLayer;
     }
    
     ?>
     <div class="sender">
     <form action="" method="POST" enctype="multipart/form-data">
         <input type="file" name="image[]" multiple/>
         <input type="submit" value="Pošalji"/>
     </form></div>
    

Imate li ideju kako ovo riješiti?

pa prije svega izmjeni sve kvačice u slova bez kvačica evo moja funkcija koja pretvara naslov u url:

    function seo_id($text)
{
	$search = array("Đ", "đ");
	$replacement = array("dj", "dj");
	$text = str_replace($search, $replacement, $text);
	setlocale(LC_ALL, 'croatian');
	$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
	$text = preg_replace('~[^\pL\d]+~u', '-', $text);
	$text = preg_replace('~[^-\w]+~', '', $text);
	$text = trim($text, '-');
	$text = preg_replace('~-+~', '-', $text);
	$text = strtolower($text);
	if (empty($text)) {
		return false;
	}
	return $text;
}

Jedan od uslova mi je da zadržim ime fotografije sa kvačicama

Zašto žele imena s kvačicama?

Pošto sam počeo na DOS-u onda sam naučen izbacivati čćžšđ. Ne volim slova s kvačicama jer se nekad zna dogoditi da kada se kopira s jednog diska na drugi da se ne skopira…

Uh, ok sretno to je znimljiv zadatak.

Pa opcionalno mozes spremiti ime u varijablu pa naknadno nakon sto spremis datoteku bez kvacica zamijeni u originalni naziv.

OK, a imate li ideju za 2. problem. Watermark se ne postavlja na :JPG (velika slova), a radi na .jpg

Pošto je PHP u pitanju onda je i Linux server a kod njega možeš zapisati Datoteka.jpg kao i datoteka.jpg i Datoteka.JPG…

Pretvori ekstenziju u mala slova :slight_smile:

A zasto ti funkcija vraca dva razlicita tipa (bool i string) ?

Je l to neka praksa u PHP-u, ili je nesto drugo u pitanju ? Pitam cisto iz znatizelje :slight_smile:

Od kada radim s typescriptom imao bi drugaciji pristup. Ovo sam mozda prije dvije godine napisao. I taj if bi trebao biti na vrhu da se ne izvrsava kod dalje ako nema parametra. A php varijable mogu sadrzavati razlicite data type-s. Tako da je validno, ali sada da pisem ponovno bi vratio prazan string najvjerojatnije. :slight_smile:

Od PHP-a 7.0 ne bi trebala biti. Tad je uveden return type

function seoId(string $text): string
{
    // manipulate and return string
}

Isto tako se treba forsirati i argument type hinting.
Kod je čitljiviji i nekad je dovoljno pogledati type hint i return type da se zna da nam (ne) treba ta funkcija pa se štedi vrijeme ne prolazeći kroz sve i jednu liniju bespotrebno.

1 Like

Linux je case sensitive pa bi trebao uraditi finkcije za .JPG, kao što imaš za .jpg . Isto i za PNG & GIF