Hintergrundfarbe bei imageCreateFrom...

Grille

Erfahrenes Mitglied
Hallo,

Ich habe hier Funktionen, die in einer "Images"-class stehen und Bilder zurechtschneiden und verkleinern können soll.

die "private" Funktionen sollen bestimmte Daten vorbereiten, "publicstaticfunction create_imagefile" soll dann das Bild erstellen. Leider schaffe ich es aber nicht, dass das Image "$oNewImage" die Hintergrundfarbe "ffffff" hat.
Wenn ich ein Bild zu sehr verkleiner und in "$oNewImage" einfüge, dann ist der Hintergrund immer schwarz.

Das Ergebnis sieht dann so aus:
http://gvb.schauart.de/images/report/view_a/ddb90ba0faf3cbe33471182f19c4a132.jpg

Könnt ihr mir bitte helfen dem Bild eine Hintergrundfarbe zu verpassen?

PHP:
private function random_image_name($sSavePfad){
srand((double)microtime()*1000000); // for older than version 4.2.0 of PHP
do{
$sNewFilename = md5(uniqid(rand())) .".jpg";
} while( file_exists($sSavePfad.$sNewFilename));
return $sNewFilename;
$GLOBALS[SYSMES] .= '$sNewFilename: '.$sNewFilename.'<br>';
}

/**
* private function get the image-height
*
* @access private
* @param $oImage
* @return $iImageHeight
*/
private function imageheight($oImage){
$aImagesource = getimagesize ($oImage);
return $iImageHeight = $aImagesource[1];
$GLOBALS[SYSMES] .= '$iImageHeight: '.$iImageHeight.'<br>';
}

/**
* private function get the image-width
*
* @access private
* @param $oImage
* @return $iImageWidth
*/
private function imagewidth($oImage){
$aImagesource = getimagesize ($oImage);
return $iImageWidth = $aImagesource[0];
$GLOBALS[SYSMES] .= '$iImageWidth: '.$iImageWidth.'<br>';
}

/**
* private function get the image-objekt
*
* @access private
* @param $oImage
* @return $oSourceImage
*/
private function imageObjekt($oImage){
$aImagedata = getimagesize ($oImage);
switch ($aImagedata[2]){
case '1':
return $oSourceImage = imageCreateFromgif($oImage);
break;

case '2':
return $oSourceImage = imageCreateFromJPEG($oImage);
break;

case '3':
return $oSourceImage = imageCreateFrompng($oImage);
break;

default:
return false;
}
$GLOBALS[SYSMES] .= '$oSourceImage: '.$oSourceImage.'<br>';
}

/**
* static function to create a imagefile
*
* @access public
* @param $oImage (gesendet von "$_FILES"), $sSavePfad (Speicherstelle des neuen Bildes), $iSollhoehe(Neubildhöhe), $iSollbreite (Neubildbreite), $iZoomfaktor (Verkleinerungsfaktor)
* @return an new image & true or false
*/
public static function create_imagefile($oImage, $sSavePfad, $iSollhoehe, $iSollbreite, $iZoomfaktor){
$sNewBildName = self::random_image_name($sSavePfad);
$oNewImage = ImageCreateTrueColor($iSollhoehe, $iSollbreite);
$oBGcolor = ImageColorAllocate ($oNewImage, 255, 255, 255);
$oSourceImage = self::imageObjekt($oImage);
$x_neu_bild = 0;
$y_neu_bild = 0;
$hoehe_neu_bild = $iSollhoehe;
$breite_neu_bild = $iSollbreite;
$x_alt_bild = ( self::imagewidth($oImage) - $iSollbreite )/2;
$y_alt_bild = ( self::imageheight($oImage) -$iSollhoehe)/2;
$hoehe_alt_bild = $iSollhoehe*$iZoomfaktor;
$breite_alt_bild = $iSollbreite*$iZoomfaktor;

ImageCopyResized($oNewImage, $oSourceImage, $x_neu_bild, $y_neu_bild, $x_alt_bild, $y_alt_bild, $breite_neu_bild, $hoehe_neu_bild, $breite_alt_bild, $hoehe_alt_bild);
imagejpeg($oNewImage, $sSavePfad.$sNewBildName, 100);
ImageDestroy($oNewImage);
@chmod($sSavePfad.$sNewBildName, 0777);
return true;
}
 
Vielleicht sollte ich anders fragen.

Wie kann ich ein Bild erstellen, diesem dann eine Hintergrundfarbe geben, und danach ein Foto daraufsetzen (mit ImageCopyResized() ) ?

Das einfärben mit einer Hintergrundfarbe ist notwendig, weil ich das Foto skalieren möchte. Sollte das Foto kleiner werden als die Kantenlänge des neuen Bildes, soll die überstehende Fläche weiss sein (und nicht schwarz wie es Standart ist)

Für jeden Tip bin ich dankbar.
 
Hallo,

ich konnte das Problem mit der Hintergrundfarbe nicht lösen, daher habe ich eine neue Funktion geschrieben, die ein hochgeladenes Bild in ein gewünschtes Format optimal und proportional einpasst, zuschneidet und dann abspeichert.

Für andere die ähnliche Probleme mit Bildern haben und haben werden, wie ich sie hatte, will ich die Funktion hier kurz erklären.

Hauptfunktion "image_proportionalfit($oImage, $aImageOrder)" bekommt den Pfad zum Bild übergeben, und ein Array, welche ein, oder mehrere Wunschgrößen und Speicherorte enthält. Meine Funktion steht innerhalb eines Objektes "Images".
PHP:
public static function image_proportionalfit($oImage, $aImageOrder){
// es wird eine Objektinterne Funktion "random_image_name('ZielSpeicherort')" aufgerufen, um einen zufälligen Dateinamen zurückzubekommen.

$sNewImageName = self::random_image_name($aImageOrder[2]);

// die Schleife wird so oft durchlaufen, bis alle angeforderten Bilder abgearbeitet sind
for($i=0;$i<=count($aImageOrder)-3;$i=$i+3){
$iOrderWidth = $aImageOrder[$i];
$iOrderHeight = $aImageOrder[$i+1];
$sSavePfad = $aImageOrder[$i+2];
$iOrderProportion = $iOrderWidth/$iOrderHeight;
// zwei Objektinterne Funktionen "imagewidth($oImage)" und "imageheight($oImage)" die Breite und Höhe des hochgeladenen Bildes ausgeben
$iImportProportion = self::imagewidth($oImage)/self::imageheight($oImage);

// New Image
$oNewImage = imagecreatetruecolor($iOrderWidth, $iOrderHeight);
$x_NewImage = 0;
$y_NewImage = 0;
$height_NewImage = $iOrderHeight;
$width_NewImage = $iOrderWidth;

// Source Image
// eine Objektinterne Funktion um das Hochgeladene Bild in ein bearbeitbares Bildobjekt umzuwandeln
$oSourceImage = self::imageObjekt($oImage);

if($iOrderProportion <= $iImportProportion){
$iScale = self::imageheight($oImage)/$iOrderHeight;

$x_SourceImage =(self::imagewidth($oImage)- ($iOrderWidth*$iScale))/2;
$y_SourceImage = 0;

$height_SourceImage = self::imageheight($oImage);
$width_SourceImage = $iOrderWidth*$iScale;

}
else {
$iScale = self::imagewidth($oImage)/$iOrderWidth;

$x_SourceImage = 0;
$y_SourceImage = (self::imageheight($oImage) - ($iOrderHeight*$iScale))/2;

$height_SourceImage = $iOrderHeight*$iScale;
$width_SourceImage = self::imagewidth($oImage);

}

// processing Data from NewImage and SourceImage
ImageCopyResized($oNewImage, $oSourceImage, $x_NewImage, $y_NewImage, $x_SourceImage, $y_SourceImage, $width_NewImage, $height_NewImage, $width_SourceImage, $height_SourceImage);

// save new Image
imagejpeg($oNewImage, $sSavePfad.$sNewImageName, 100);
ImageDestroy($oNewImage);
@chmod($sSavePfad.$sNewImageName, 0777);

}
return true;
}

Hier die zusätzlichen Funktionen die aufgerufen wurden:
PHP:
/**
* private function to create a filename
*
* @access private
* @param $pfad
* @return $sNewFilename
*/
private function random_image_name($sSavePfad){
srand((double)microtime()*1000000); // for older than version 4.2.0 of PHP
do{
$sNewFilename = md5(uniqid(rand())) .".jpg";
} while( file_exists($sSavePfad.$sNewFilename));
return $sNewFilename;
}
 
 
/**
* private function get the image-height
*
* @access private
* @param $oImage
* @return $iImageHeight
*/
private function imageheight($oImage){
$aImagesource = getimagesize ($oImage);
return $iImageHeight = $aImagesource[1];
}


/**
* private function get the image-width
*
* @access private
* @param $oImage
* @return $iImageWidth
*/
private function imagewidth($oImage){
$aImagesource = getimagesize ($oImage);
return $iImageWidth = $aImagesource[0];
}
 
 
/**
* private function get the image-objekt
*
* @access private
* @param $oImage
* @return $oSourceImage
*/
private function imageObjekt($oImage){
$aImagedata = getimagesize ($oImage);
switch ($aImagedata[2]){
case '1':
return $oSourceImage = imageCreateFromgif($oImage);
break;

case '2':
return $oSourceImage = imageCreateFromJPEG($oImage);
break;

case '3':
return $oSourceImage = imageCreateFrompng($oImage);
break;

default:
return false;
}
}

Um nun ein Bild umzuwandeln, rufe ich die Funktion so auf (zu beachten ist, dass ich innerhalb eines Templatesystems, mit Objekten arbeite. Jeder muss also selbst die Funktionen für sich so anpassen und aufrufen, dass es funktioniert)

Funktionsaufruf:
PHP:
// zuerst das Array welches die angeforderten Bildgrößen mit zugehörigem Speicherort enthält (immer Breite_1, Höhe_1, Speicherort_1, Breite_2, Höhe_2, Speicherort_2, usw)
$aImageOrder = array(10 , 10 , realpath(dirname(__FILE__).'/../images/Logos_10x10').'/' , 100 , 100 , realpath(dirname(__FILE__).'/../images/Logos_100x100').'/', 250 , 100 , realpath(dirname(__FILE__).'/../images/Logos_250x100').'/');
 
// Funktion innerhalb des Objektes "Images" wird aufgerufen
Images::image_proportionalfit($_FILES['upload_file']['tmp_name'] , $aImageOrder)

Ich hoffe der Code enthält keine Fehler; bei mir hat alles Funktioniert. Wenn doch Fehler auftreten, bitte melden.

Grüße,
Grille
 
Zuletzt bearbeitet:
Zurück