Image CROP functie
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.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
$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");
$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");
Als je het helemaal flexibel wilt hebben dan kan je altijd de uploadclass van Verot.net gebruiken.
Ik heb onvoldoende kennis qua programmeren en gebruik van php.
Om dit wat je oppert te verwerken in mijn huidige situatie is mij te complex.
Wil je me helpen met die CROP optie in mijn huidige script?
Om dit wat je oppert te verwerken in mijn huidige situatie is mij te complex.
Wil je me helpen met die CROP optie in mijn huidige script?
Gewijzigd op 20/10/2023 17:25:41 door - Ariën -
Hoezo zou het complex zijn? Heb je het uberhaupt al gezien?
https://www.verot.net/php_class_upload.htm
Hiermee heb je zeker wat flexibels in handen als je de maten aan wit passen, de verhoudingen, of als je wilt croppen.
Een simpele configuratie zorgt ervoor dat alles volgens jouw wensen wordt geconverteerd.
Als je het echt zelf wilt doen, kan je kijken naar imagecrop
https://www.verot.net/php_class_upload.htm
Hiermee heb je zeker wat flexibels in handen als je de maten aan wit passen, de verhoudingen, of als je wilt croppen.
Een simpele configuratie zorgt ervoor dat alles volgens jouw wensen wordt geconverteerd.
Als je het echt zelf wilt doen, kan je kijken naar imagecrop
Gewijzigd op 20/10/2023 17:29:09 door - Ariën -
Omdat ik niet begrijp hoe ik dit moet verwerken. En ik hanteer 1 output maat. Dus heb al die andere opties niet nodig. Is het te ingewikkeld om mij in mijn huidige script te helpen?
Edit:
Ik heb een aantal berichten ingesnoeid van wat quotes omdat het niet nodig is om het eerst voorgaande bericht integraal te quoten. Zo blijft het topic beter leesbaarder.
Alvast bedankt!
Alvast bedankt!
Gewijzigd op 20/10/2023 17:41:27 door - Ariën -
Mijn tip is om het script denkbeeldig in tweeën te delen. Het deel van het uploaden is niet van toepassing. Vanaf lijn 41 vind in jouw script het bewerken van de afbeelding plaats. Dus dan heb je maar een stuk of tien regels.
Als je kijkt naar het voorbeeld van imagecrop() op php.net dan zie je hoe je dit moet implementeren na je imagecreatefromjpeg() lijn 41.
Over de andere weg gesproken:
Verot.net heeft overigens in het voorbeeld meerdere outputs, maar je kan dit ook beperken tot een enkele.
Als je kijkt naar het voorbeeld van imagecrop() op php.net dan zie je hoe je dit moet implementeren na je imagecreatefromjpeg() lijn 41.
Over de andere weg gesproken:
Verot.net heeft overigens in het voorbeeld meerdere outputs, maar je kan dit ook beperken tot een enkele.
Wil je me helpen die imagecrop te verwerken in mijn script?
En dat al na 9 seconden, zonder dat je zelf wat geprobeerd heb na mijn tip?
De puzzelstukjes heb je. probeer ze eens in te passen. :-)
De puzzelstukjes heb je. probeer ze eens in te passen. :-)
Gewijzigd op 20/10/2023 17:50:03 door - Ariën -
Omdat ik het niet begrijp Arien. Ik weet niet wat en hoe. Mijn kennis van php is zo basic. Ik leer van hulp die ik krijg, dan analyseer ik wat ik zie en probeer dat in me op te nemen. Ik snap echt niet wat sommige functies precies doen, dus vind het ingewikkeld om eraan te sleutelen.
Ik begrijp tijdens het programmeren sommige dingen ook niet, maar dan lees ik eerst hoe het werkt, en probeer ik wat met een simpel voorbeeld. En als je functies niet snapt, dan wordt dat op php.net uitgelegd. www.php.net/FUNCTIENAAM
Als je wilt dat ik je help, vertel dan even concreet wat je niet snapt, wat je geprobeerd hebt, en wat er gebeurt.
Tip: Beperk tunnelvisie door een klein voorbeeld te maken i.p.v. in een groot script te werken. En neem ook een pauze tussendoor.
Als je wilt dat ik je help, vertel dan even concreet wat je niet snapt, wat je geprobeerd hebt, en wat er gebeurt.
Tip: Beperk tunnelvisie door een klein voorbeeld te maken i.p.v. in een groot script te werken. En neem ook een pauze tussendoor.
Gewijzigd op 20/10/2023 17:57:11 door - Ariën -
Ik begrijp niet hoe ik precies die imagecrop in mijn script moet toepassen en wat ik dan moet wijzigen of weghalen. Wat doet wat...
Uit jouw script
$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.
$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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Gewijzigd op 20/10/2023 18:07:10 door - Ariën -
@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?
Toevoeging op 20/10/2023 18:08:29:
@arien
Ja, ik had al gekeken...
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?
Toevoeging op 20/10/2023 18:08:29:
@arien
Ja, ik had al gekeken...
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
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.
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?
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.
Toevoeging op 20/10/2023 18:35:55:
Hopelijk snap je nu hoe het werkt.
Speel er gerust mee. Lijn 9 is het interessantste.
Dan is het infeite gewoon copy and paste.
Toevoeging op 20/10/2023 18:35:55:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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);
?>
// 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.
Gewijzigd op 20/10/2023 18:43:31 door - Ariën -
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?
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:
Speel er eens mee. Want daar leer je van.
En op lijn 52 bepaal je al de nieuwe bestandnaam:
Speel er eens mee. Want daar leer je van.




