Beste mensen,

Ik gebruik al jarenlang een script om via een formulier upload een image naar de server te sturen.
Wat ik mis is een CROP functie. Ik zou graag een vaste vierkant van 450 px x 450 px willen hanteren. Soms zijn foto's landscape en als ik dat nu upload dan propt hij met dit script de afbeelding in elkaar.
Kan en wil iemand mij helpen om in mijn huidige script iets te wijzigen of toe te voegen waarmee ik van een landscape afbeelding een vierkant kant uitsnijden? Ik weet dat er tools als croppie bestaat, maar dit vind ik te omslachtig.

$streepje = "-";
$extentie = ".jpg";
$cijfer1 = mt_rand(1, 9);

$newfilename = $Datum . $streepje . $cijfer1 . $extentie;

$change="";
$abc="";

define ("MAX_SIZE","450");
function getExtension($str) {
         $i = strrpos($str,".");
         if (!$i) { return ""; }
         $l = strlen($str) - $i;
         $ext = substr($str,$i+1,$l);
         return $ext;
 }

$errors=0;
  
if($_SERVER["REQUEST_METHOD"] == "POST")
   {
      $image = $_FILES['bestand']['name'];
      $uploadedfile = $_FILES['bestand']['tmp_name'];
     
if ($image) 
   {
      $filename = stripslashes($_FILES['bestand']['name']);
      $extension = getExtension($filename);
      $extension = strtolower($extension);
		
if (($extension != "jpg") && ($extension != "jpeg")) 
   {
      $change='<div class="msgdiv">Gebruik ENKEL *.jpg of *.jpeg bestanden!</div> ';
      $errors=1;
   }
   else
   {

$uploadedfile = $_FILES['bestand']['tmp_name'];
$src = imagecreatefromjpeg($uploadedfile);

list($width,$height)=getimagesize($uploadedfile);

$newwidth=450;
$newheight=450;
//$newheight=($height/$width)*$newwidth;
$tmp=imagecreatetruecolor($newwidth,$newheight);

imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);

$filename = $_SERVER['DOCUMENT_ROOT'] . "/img_artiesten/". $_FILES['bestand']['name'];

imagejpeg($tmp,$filename,100);

imagedestroy($tmp);
imagedestroy($src);

}
}
}

rename("$filename", $_SERVER['DOCUMENT_ROOT'] . "/img_artiesten/$newfilename");
Uit jouw script

$cijfer1 = mt_rand(1, 9);
$newfilename = $Datum . $streepje . $cijfer1 . $extentie;


$cijfer1 is dus een willekeurig cijfer van 1 / 9.
laten we zeggen 5

Dus je eerste upload vandaag wordt geschreven als
20231020-5.jpg


Je tweede upload: er wordt weer een cijfer gekozen. Een van de 9 mogelijkheden. Elke mogelijkheid heeft 11% kans.
Daar kán dus 8 uitkomen.
Maar de kans op 2 en net zo groot.
Maar nog belangrijker: de kans op 5 is ook net zo groot.

Je hebt dus 11% kans dat je tweede upload de eerste overschrijft.
Maar goed: 89% kans dat het goed gaat.

Dan hebben we dus 20231020-5.jpg en 20231020-8.jpg

Derde foto-upload:
Van de 9 (en niet 10) mogelijke uitkomsten van mt_rand() zijn er nu 2 die tot problemen leiden.

Als ik het goed heb, dus 22% kans.

En in het onwaarschijnlijke geval dat je 9 foto's hebt geupload die niet overschreven zijn:
Daarna is de kans bij de 10e foto gewoon 100%....

kortom: RANDOM is iets anders dan UNIEK.
Het verbaast me dat dat nooit tot problemen geleid heeft.


Vincent Gogh op 20/10/2023 18:00:22

Ik begrijp niet hoe ik precies die imagecrop in mijn script moet toepassen en wat ik dan moet wijzigen of weghalen. Wat doet wat...


Heb je al gekeken op www.php.net/imagecrop?

@Ivo:
Ik gebruik time() voor de datums, met een random string uit uniqueid() erachter, en een while() functie om te kijken of het bestand bestaat.
<?php
private static function createFilename($filename) {
while (true) {
$timecreated = time();
$file = pathinfo($filename);
$prefix = uniqid();
$filename_new = $timecreated . '_' . $prefix;
if (!file_exists($filename_new))
break;
}
#$this->filename = $filename_new;
return $filename_new;
}
?>
@ivo

Het is een eenmalige upload van die afbeelding. Die datum komt uit de database. Het gaat om een afbeelding voor een evenement en ik heb er maar 1 per dag en heel soms 2. Dan hebben ze dezelfde datum maar een ander nummer. Ik wist echt niet wat ik anders had moeten gebruiken hiervoor. Wat zou je dan wel gebruiken?

[size=xsmall]Toevoeging op 20/10/2023 18:08:29:[/size]

@arien

Ja, ik had al gekeken...


<?php
$im = imagecreatefrompng('example.png');
$size = min(imagesx($im), imagesy($im));
$im2 = imagecrop($im, ['x' => 0, 'y' => 0, 'width' => $size, 'height' => $size]);
if ($im2 !== FALSE) {
imagepng($im2, 'example-cropped.png');
imagedestroy($im2);
}
imagedestroy($im);
?>
Zie mijn update. Komt regelrecht uit mijn CMS-systeem. De functie genereert een nieuwe unieke naam aan de hand van de naam die een bestand heeft.

Ik had dit ooit eens nodig omdat ik lokaal zo snel kan uploaden dat meerdere kleine bestanden in een enkele seconde (wat time() dus dus) dezelfde naam kregen . :-P
@arien

Dit staat er op php.net over die uniqid():

Warning

This function tries to create unique identifier, but it does not guarantee 100% uniqueness of return value.
Klopt, en daarom check ik of de bestandsnaam bestaat, en zo ja (kleine kans) dan volgt er een nieuwe poging.
Ik voeg normaliter 1 keer een afbeelding toe in de database en upload map en dan volstaat wat ik nu gebruik prima. Het is enkel bij het wijzigen van belang dat hij een nieuwe naam krijgt omdat de eerdere afbeelding al op de server staat en ik met mijn script dus niet kan overschrijven.

Maar goed, we dwalen af. Zie jij hoe ik die imagecrop in mijn huidige script zou kunnen verwerken? Wil je het voor me uitwerken?
Heb je het script al uitgetest?
Dan is het infeite gewoon copy and paste.

[size=xsmall]Toevoeging op 20/10/2023 18:35:55:[/size]

<?php
// Maak een nieuwe afbeelding (png) aan de hand van een bestaande
$im = imagecreatefrompng('example.png');

// Pak de laagste waarde van de hoogte of de breedte
$size = min(imagesx($im), imagesy($im));

// crop de afbeelding, geef een array mee voor de uitsnede met de waardes x, y, breedte en hoogte.
$im2 = imagecrop($im, ['x' => 0, 'y' => 0, 'width' => $size, 'height' => $size]);

// als croppen gelukt is (het is geen false), sla het dan op, en verwijder het bewerkte resultaat uit het geheugen want we hebben het niet meer nodig.

if ($im2 !== FALSE) {
imagepng($im2, 'example-cropped.png');
imagedestroy($im2);
}

// verwijder de bronafbeelding uit het geheugen.
imagedestroy($im);
?>

Hopelijk snap je nu hoe het werkt.
Speel er gerust mee. Lijn 9 is het interessantste.
Dank voor de uitleg... Ik denk te snappen wat wat doet...
Maar er staat veel in mijn HUIDIGE script wat ik ook al niet begrijp. Ik heb dit ooit van iemand overgenomen en heeft altijd gewerkt omdat ik zelf met een fotobewerker de afbeelding vierkant maakte.
Nu wil ik dat graag via mijn huidige script doen en zit echt te stoeien.
Wat moet ik aanpassen en wat moet ik verwijderen? Hoe krijg ik die naam gewijzigd en uiteindelijk op de server geupload?
Lijn 41 t/m 57 heb je niet nodig, als het enkel om het croppen gaat.
En op lijn 52 bepaal je al de nieuwe bestandnaam:

$filename = $_SERVER['DOCUMENT_ROOT'] . "/img_artiesten/". $_FILES['bestand']['name'];


Speel er eens mee. Want daar leer je van.

Reageren