2015-06-19 15 views
21

Was kann dazu führen, dass php gd nach der Größenanpassung ein schwarzes Bild erzeugt? Der folgende Code gibt immer ein schwarzes Bild für jede gültige JPEG-Datei aus.Größenänderung mit GD-Ausgaben schwarze Bilder

<?php 

$filename = 'test.jpg'; 
$percent = 0.5; 

header('Content-Type: image/jpeg'); 

list($width, $height) = getimagesize($filename); 
$newwidth = $width * $percent; 
$newheight = $height * $percent; 

$thumb = imagecreatetruecolor($newwidth, $newheight); 
$source = imagecreatefromjpeg($filename); 

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

imagejpeg($thumb); 
imagedestroy($thumb); 
?> 

Ausgabe von gd_info():

Array 
(
    [GD Version] => bundled (2.1.0 compatible) 
    [FreeType Support] => 1 
    [FreeType Linkage] => with freetype 
    [T1Lib Support] => 
    [GIF Read Support] => 1 
    [GIF Create Support] => 1 
    [JPEG Support] => 1 
    [PNG Support] => 1 
    [WBMP Support] => 1 
    [XPM Support] => 
    [XBM Support] => 1 
    [JIS-mapped Japanese Font Support] => 
) 

Der Code erschien in anderen Umgebungen arbeiten. Wahrscheinlich hängt es mit OS, installierten Paketen, Bibliotheken, usw. zusammen?

+0

Der Code funktioniert hier gut. : -/'PHP 5.3.29'' GD Version: gebündelt (2.1.0 kompatibel) ' –

+0

Funktioniert auch mit HHVM, HipHop VM 3.6.1 (rel) – codeaken

+0

Haben Sie die Protokolldatei überprüft? – hek2mgl

Antwort

7
Forschung

Nur versucht, Ihre Situation zu reproduzieren. Ausführen von Code mit Out-of-the-box PHP und Apache zeigt folgende

Das Bild „http://localhost/“ kann nicht angezeigt werden, da es Fehler enthält.

Obwohl Browser Sie sagt, dass es einige Fehler aufgetreten sind, können sie nicht, weil der als Antwort zurück Header zu sehen waren Content-Type: image/jpeg somit Browser zwingt es als Bild zu interpretieren. Durch Entfernen der header und Einstellung der folgenden wird Fehler ausgegeben.

ini_set('error_reporting', E_ALL); 
ini_set('display_errors', true); 
... 
//header('Content-Type: image/jpeg'); 
... 
Antwort

Was php gd ein schwarzes Bild zu erzeugen, nachdem die Größenänderung verursachen kann?

Da die gd_info Ausgang beweist, dass die GD extension geladen wird, überprüfen Sie, ob der Dateiname (Linux ist casesensitive) und die Berechtigungen korrekt sind. Wenn Apache als www-data (Gruppe) laufen

sudo chown :www-data test.jpg && sudo chmod 660 test.jpg 
-Code Verbesserung/Lösung
ini_set('error_reporting', E_ALL); 
ini_set('display_errors', true); 

if (extension_loaded('gd') && function_exists('gd_info')) 
{ 
    $filename = 'test.jpg'; 

    if (file_exists($filename) && is_readable($filename)) 
    { 
     $percent = 0.5; 

     header('Content-Type: image/jpeg'); 

     list($width, $height) = getimagesize($filename); 
     $newwidth = $width * $percent; 
     $newheight = $height * $percent; 

     $thumb = imagecreatetruecolor($newwidth, $newheight); 
     $source = imagecreatefromjpeg($filename); 

     imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

     imagejpeg($thumb); 
     imagedestroy($thumb); 
    } 
    else 
    { 
     trigger_error('File or permission problems'); 
    } 
} 
else 
{ 
    trigger_error('GD extension not loaded'); 
} 
Kommentare

Dies sollte als eine vorübergehende Lösung (Entwicklungsumgebung) verwendet werden.IMHO, sollten die Fehler von einem zentralen Fehlerhandler behandelt werden, display_errors sollte false in Produktion sein. Auch die Fehler (in diesem Fall würde es Fatal error werden) werden standardmäßig protokolliert - überprüfen Sie die Protokolle für mehr (die häufige, desto besser). Auch unter Linux (mit apt) die Einzeiler wird installieren GD auf Ihrem System:

sudo apt-get update && sudo apt-get install php5-gd && sudo /etc/init.d/apache2 restart 
0

Stellen Sie sicher, dass gd installiert und aktiviert ist.

Um zu überprüfen, eine PHP-Datei mit folgendem Befehl erstellen:

<?php phpinfo(); 

Access die Datei über einen Browser und navigieren Sie zu dem gd Abschnitt nach unten. Wenn gd nicht vorhanden ist oder es deaktiviert ist, fügen Sie es mit yum, apt-get oder dem Windows-Äquivalent hinzu.

Sie benötigen auch die verfügbare GD-Bibliothek (http://www.libgd.org/).

Sie können für eine bessere Bildqualität auf IMagick (http://php.net/manual/en/book.imagick.php) umstellen.

0

Versuchen Sie diesen Code, um die Fehler zu sehen, die passiert sind:

<?php 
error_reporting(E_ALL); 
ini_set("display_errors", 1); 

$filename = 'test.jpg'; 
$percent = 0.5; 

list($width, $height) = getimagesize($filename); 
$newwidth = $width * $percent; 
$newheight = $height * $percent; 

$thumb = imagecreatetruecolor($newwidth, $newheight); 
$source = imagecreatefromjpeg($filename); 

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

//header('Content-Type: image/jpeg'); 
//imagejpeg($thumb); 
//imagedestroy($thumb); 
?> 

Also, wenn PHP einen Fehler stößt, ist es auf dem Bildschirm angezeigt. Wenn kein Fehler vorliegt, wird der Bildschirm leer angezeigt.

+0

error_reporting wird nur die Berichtsebene festlegen. Siehe http://php.net/manual/en/function.error-reporting.php – sitilge

+0

Oh, ich habe die 'display_errors' Direktive vergessen, habe sie einfach in den Code eingefügt (frage mich, ob es darum geht, worüber du gesprochen hast?) – Dinei

0

Unten Funktion erzeugt ein Miniaturbild, mit wenigen Änderungen können Sie O/P es auf dem Bildschirm als auch. Ich denke, auf diese Weise ist es nützlicher.

/* 
* PHP function to resize an image maintaining aspect ratio 
* http://salman-w.blogspot.com/2008/10/resize-images-using-phpgd-library.html 
* 
* Creates a resized (e.g. thumbnail, small, medium, large) 
* version of an image file and saves it as another file 
*/ 

define('THUMBNAIL_IMAGE_MAX_WIDTH', 150); 
define('THUMBNAIL_IMAGE_MAX_HEIGHT', 150); 

function generate_image_thumbnail($source_image_path, $thumbnail_image_path) 
{ 
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path); 
    switch ($source_image_type) { 
     case IMAGETYPE_GIF: 
      $source_gd_image = imagecreatefromgif($source_image_path); 
      break; 
     case IMAGETYPE_JPEG: 
      $source_gd_image = imagecreatefromjpeg($source_image_path); 
      break; 
     case IMAGETYPE_PNG: 
      $source_gd_image = imagecreatefrompng($source_image_path); 
      break; 
    } 
    if ($source_gd_image === false) { 
     return false; 
    } 
    $source_aspect_ratio = $source_image_width/$source_image_height; 
    $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH/THUMBNAIL_IMAGE_MAX_HEIGHT; 
    if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) { 
     $thumbnail_image_width = $source_image_width; 
     $thumbnail_image_height = $source_image_height; 
    } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) { 
     $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio); 
     $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT; 
    } else { 
     $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH; 
     $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH/$source_aspect_ratio); 
    } 
    $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height); 
    imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height); 
    imagejpeg($thumbnail_gd_image, $thumbnail_image_path, 90); 
    imagedestroy($source_gd_image); 
    imagedestroy($thumbnail_gd_image); 
    return true; 
} 

Siehe this more Informationen.

Wenn php-gd nicht existiert, verwenden Sie den folgenden Befehl.

sudo apt-get install php5-gd 
Verwandte Themen