Hintergrund anpassen bei Thumbnails
Manu
- php
0 LX
Hallo zusammen,
für ein kleines Projekt hab ich eine Thumbnail-Funktion geschrieben, die eine Vorschau eines Bildes über die gd nach Upload generiert.
Diese Vorschau soll so wie die Miniaturansicht im Windows-Explorer funktionieren: bei einem schmalen Bild wird das selbige proportional verkleinert und im Thumbnail entstehen so Ränder.
Das funktioniert auch soweit, aber ich habe das Problem, dass ich die Hintergrundfarbe nicht richtig angepasst bekomme (siehe Kommentar 'set background color').
So wie es momentan gescriptet ist, bekomme ich meine weiße Hintergrundfarbe zwar bei breiten Bildern hin, habe ich jedoch hohe Bilder, so erscheint nur der linke Rand im gewünschten weiß, der rechte bleibt schwarz.
Bin für jede Hilfe sehr dankbar.
//Aufruf: generateThumb (Pfad+Dateiname, Pfad+NeuerDateiname, NeueBreite, NeueHöhe, Proportional)
function generateThumb ($sFQFilename, $sFQNewFilename, $iNewWidth, $iNewHeight, $bProportional = TRUE) {
//@unlink($sFQNewFilename);
$aInfo = @getimagesize($sFQFilename);
if($bProportional) {
$iWidth = $aInfo[0];
$iHeight = $aInfo[1];
$iRatioW = $iNewWidth / $iWidth;
$iRatioH = $iNewHeight / $iHeight;
if ($iRatioW < $iRatioH) {
$iNewW = $iWidth * $iRatioW;
$iNewH = $iHeight * $iRatioW;
} else {
$iNewW = $iWidth * $iRatioH;
$iNewH = $iHeight * $iRatioH;
}
} else {
$iNewW = $iNewWidth;
$iNewH = $iNewHeight;
}
$iXCrop = 0;
$iYCrop = 0;
if($iWidth > $iHeight) {
$iXCrop = 0;
$iYCrop = intval(($iNewHeight-$iNewH)/2);
}
if($iHeight > $iWidth) {
$iXCrop = intval(($iNewWidth-$iNewW)/2);
$iYCrop = 0;
}
switch($aInfo[2]) {
//jpg
case 2:
$rImgA = imagecreatefromjpeg($sFQFilename);
$rImgB = imagecreatetruecolor($iNewW,$iNewH);
imagecopyresampled($rImgB, $rImgA, 0, 0, 0, 0, $iNewW, $iNewH, $aInfo[0], $aInfo[1]);
$rImgC = imagecreatetruecolor ($iNewWidth, $iNewHeight);
// set background color
$rColor = imagecolorallocate($rImgB, 255, 255, 255);
imagefill($rImgC, 0, 0, $rColor);
imagecopy($rImgC,$rImgB,$iXCrop,$iYCrop,0,0,$iNewWidth,$iNewHeight);
imagejpeg($rImgC, $sFQNewFilename);
imagedestroy ($rImgA);
imagedestroy ($rImgB);
imagedestroy ($rImgC);
return TRUE;
break;
default:
return FALSE;
}
}
imageFill füllt bis zur nächsten Begrenzung. Bei einem leeren Image ist das nur ein Pixel, da Alpha automatisch eine farbliche Begrenzung darstellt. Benutze lieber imageFilledRectangle.
Gruß, LX