PHP Image upload haalt kwaliteit omlaag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

P de B

P de B

23/03/2015 10:58:06
Quote Anchor link
Hallo iedereen,

Voor een website die ik aan het maken ben moeten er plaatjes worden geupload, echter merk ik dat de kwaliteit van de plaatjes erg omlaag wordt getrokken waardoor er ook kleurverschillen optreden tussen de originele afbeeldingen en de geuploade afbeeldingen.

De applicatie dient een geuplaod plaatje te re-sizen naar drie verschillende groottes. Bekijk hier het verschil. Eerste plaatje is via de applicatie gedaan:

Afbeelding

En het volgende plaatje heb ik simpelweg met MS Paint ge-resized:

Afbeelding

Hier is duidelijk te zien dat de foto die geüpload is een stuk vager is dan de afbeelding die via Paint is verkleind.

De code dit ik (op dit moment even) gebruik ziet er als volgt uit, ik heb inmiddels al een paar dingen geprobeerd;

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
        $file = $_FILES['image']['tmp_name'];
        $width = "1126";
        $height = "751";
        list($width_orig, $height_orig) = getimagesize($file);
        
        $ratio_orig = $width_orig / $height_orig;
        if ($width / $height > $ratio_orig) {
            $width = $height * $ratio_orig;
        } else {
            $height = $width / $ratio_orig;
        }
        
        $image_p = imagecreatetruecolor($width, $height);
        $image = @imagecreatefromjpeg($file);
        imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
        
        imagejpeg($image_p, "../uploads/".$_POST['id']."_large.jpg", 100);


(overigens zit op de $_POST variabel een regex controle voordat 'ie wordt doorgelaten)

Mocht iemand een idee/tips hebben hoor ik dat graag.

Gr,

Patrick

Toevoeging op 23/03/2015 11:54:46:

Zojuist gebruik gemaakt van Imagick, lijkt al iets beter te gaan, maar krijg nog steeds een iets vager ge-resized plaatje dan wanneer het via Paint gebeurt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
        $image = new Imagick($file);
        $image->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 0.5, true);
        $image->writeImage("../uploads/".$_POST['id']."_large.jpg");
        $image->destroy();
 
PHP hulp

PHP hulp

21/11/2024 20:47:50
 
Bart V B

Bart V B

23/03/2015 12:54:25
Quote Anchor link
Het vervagen in imagemick komt door deze regel: Imagick::FILTER_LANCZOS
Maar probeer je een image te vergroten of te verkleinen?
Je hebt eigenlijk altijd iets of wat kwaliteitsverlies. Het is maar net waar je het voor nodig hebt.
 
P de B

P de B

23/03/2015 13:46:04
Quote Anchor link
Bart V B op 23/03/2015 12:54:25:
Het vervagen in imagemick komt door deze regel: Imagick::FILTER_LANCZOS
Maar probeer je een image te vergroten of te verkleinen?
Je hebt eigenlijk altijd iets of wat kwaliteitsverlies. Het is maar net waar je het voor nodig hebt.


Hi Bart,

Thanks voor je reactie. Het gaat hierbij om verkleinen. De filter die ik heb gepakt werd elders benoemd als "beste" keus. Hetgeen wat er moet gebeuren is dat geüploade plaatjes worden verkleind en daarbij mag dus eigenlijk geen kwaliteitsverlies optreden.

Zelfs als ik een simpele resize doe met de standaard php mogelijkheden ziet het plaatje wat er uit komt er vele malen slechter uit dan wanneer ik dat dus bijv. in Paint doe, terwijl ik daar de zelfde actie onderneem: Openen -> verkleinen -> opslaan.

Ik moet zeggen dat de kwaliteit m.b.v. Imagick al wel wat beter is dan wat ik eerst had, maar nog steeds zie ik verschil.

Gr
 
Thomas van den Heuvel

Thomas van den Heuvel

23/03/2015 14:45:51
Quote Anchor link
Observatie: de eerste (geresizede) afbeelding is 1126 x 750.

Misschien helpt het als je je nieuw berekende dimensies afrondt naar een geheel getal (bijvoorbeeld met round()) voordat je deze gebruikt in functies als imagecreatetruecolor() en imagecopyresampled().

Ook, bij de generatie van de uiteindelijke afbeelding ga je uit van vaste afmetingen en zorg je dat het geresizede plaatje past in de linker bovenhoek van deze afbeelding. Zou het niet beter zijn om de nieuwe dimensies van de afbeelding af te laten hangen van ofwel een maximale breedte ofwel een maximale hoogte, en dat je dat de nieuwe dimensies berekent met behulp van respectievelijk breedte/max_breedte of hoogte/max_hoogte, maar niet van allebei, want:
Quote:
If the source and destination coordinates and width and heights differ, appropriate stretching or shrinking of the image fragment will be performed.

Wellicht ligt het kwaliteitsverlies daar aan? Je zou eens kunnen kijken door je afbeelding eens op te blazen, en te kijken of deze dan ook wordt opgerekt. (Dus op een of andere manier een groot dimensie-verschil te introduceren, zodat het effect van de resampling overdreven wordt getoond)

Of dat je in de afbeelding eerst de dimensies corrigeert (bijsnijden, aanvullen) zodat je resampling goed gaat als het de bedoeling is dat de uiteindelijke afbeelding altijd dezelfde afmeting heeft?
Gewijzigd op 23/03/2015 15:00:15 door Thomas van den Heuvel
 



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.