Image CROP functie
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.
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 -
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 -
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 -
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?
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.
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.
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. 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...
$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 -
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...
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
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.
Maar goed, we dwalen af. Zie jij hoe ik die imagecrop in mijn huidige script zou kunnen verwerken? Wil je het voor me uitwerken?
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 -
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?
En op lijn 52 bepaal je al de nieuwe bestandnaam:
Speel er eens mee. Want daar leer je van.