PHP Image upload haalt kwaliteit omlaag
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:
En het volgende plaatje heb ik simpelweg met MS Paint ge-resized:
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
$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:
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.
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.
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
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