Image CROP functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Vincent Gogh

Vincent Gogh

20/10/2023 16:38:19
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
$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");
 
PHP hulp

PHP hulp

02/03/2024 20:19:20
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 16:57:06
Quote Anchor link
Als je het helemaal flexibel wilt hebben dan kan je altijd de uploadclass van Verot.net gebruiken.
 
Vincent Gogh

Vincent Gogh

20/10/2023 17:07:57
Quote Anchor link
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?
Gewijzigd op 20/10/2023 17:25:41 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 17:25:24
Quote Anchor link
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
Gewijzigd op 20/10/2023 17:29:09 door - Ariën -
 
Vincent Gogh

Vincent Gogh

20/10/2023 17:39:37
Quote Anchor link
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!
Gewijzigd op 20/10/2023 17:41:27 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 17:46:37
Quote Anchor link
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.
 
Vincent Gogh

Vincent Gogh

20/10/2023 17:46:46
Quote Anchor link
Wil je me helpen die imagecrop te verwerken in mijn script?
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 17:48:51
Quote Anchor link
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. :-)
Gewijzigd op 20/10/2023 17:50:03 door - Ariën -
 
Vincent Gogh

Vincent Gogh

20/10/2023 17:51:21
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 17:55:40
Quote Anchor link
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.
Gewijzigd op 20/10/2023 17:57:11 door - Ariën -
 
Vincent Gogh

Vincent Gogh

20/10/2023 18:00:22
Quote Anchor link
Ik begrijp niet hoe ik precies die imagecrop in mijn script moet toepassen en wat ik dan moet wijzigen of weghalen. Wat doet wat...
 
Ivo P

Ivo P

20/10/2023 18:00:55
Quote Anchor link
Uit jouw script
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$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.
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 18:02:22
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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;
    }

?>
Gewijzigd op 20/10/2023 18:07:10 door - Ariën -
 
Vincent Gogh

Vincent Gogh

20/10/2023 18:06:20
Quote Anchor link
@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...


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?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);
?>
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 18:09:13
Quote Anchor link
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
 
Vincent Gogh

Vincent Gogh

20/10/2023 18:15:22
Quote Anchor link
@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.
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 18:16:33
Quote Anchor link
Klopt, en daarom check ik of de bestandsnaam bestaat, en zo ja (kleine kans) dan volgt er een nieuwe poging.
 
Vincent Gogh

Vincent Gogh

20/10/2023 18:20:46
Quote Anchor link
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?
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 18:24:24
Quote Anchor link
Heb je het script al uitgetest?
Dan is het infeite gewoon copy and paste.

Toevoeging op 20/10/2023 18:35:55:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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 -
 
Vincent Gogh

Vincent Gogh

20/10/2023 18:47:59
Quote Anchor link
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?
 
- Ariën  -
Beheerder

- Ariën -

20/10/2023 18:56:36
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$filename = $_SERVER['DOCUMENT_ROOT'] . "/img_artiesten/". $_FILES['bestand']['name'];


Speel er eens mee. Want daar leer je van.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.