2016-03-29 5 views
3

Ich habe einen PHP-Code geschrieben, der GD auf einem Ubuntu-Rechner (PHP 5.5.9) verwendet und ihn auf Amazon EC2 mit Amazon Linux (PHP 5.5 0,31), und ich bin immer ganz unterschiedliche Ergebnisse aus dem Code aus der gleichen Eingabedatendatei (ich bin nur imagecreatefromstring() verwendet;. $data enthält den Inhalt einer JPEG-Datei)Eine Reihe von Bild/GD-Problemen: Zuschneiden, Einstellen der Farbe und Transparenz

  1. Bevor ich geändert Maschinen wäre es ändere das Weiß zu Transparent. Das ändert sich nicht mehr.
  2. Es wurde verwendet, um die Grafik perfekt zu beschneiden. Jetzt lässt es links etwas weiß und schneidet das Bild ein wenig rechts ab.
  3. Auf der linken Seite befindet sich eine dünne schwarze Linie.
  4. Ich kann nicht einmal scheinen, das Bild zu ändern, eine Farbe mit imagecolorset().

Hier ist der Code:

if ($isFileString) { 
    $src2 = imagecreatefromstring($data); 
} else { 
    $src2 = imagecreatefromjpeg($data); 
} 

// This was an attempt to get it to recognize transparent. 
if (!unlink ("../drive/sigs/tmp.png")) 
    die("Failed to delete tmp.png"); 

imagepng($src2, "../drive/sigs/tmp.png"); 
imagedestroy($src2); 
$src = imagecreatefrompng("../drive/sigs/tmp.png"); 

imagealphablending($src, false); 
imagesavealpha($src, true); 

for ($i=0; $i< 1024; $i++) { 
    echo $i; 
    echo print_r(imagecolorsforindex($src, $i)); 
    imagecolorset($src, $i, 255, 255, 255,255); 
    echo print_r(imagecolorsforindex($src, $i)); 
    echo "<BR>"; 
} 

$src = imagecropauto($src, IMG_CROP_WHITE); 
$white = imagecolorallocate($src, 255, 255, 255); 
imagecolortransparent($src, $white); 
$src = imagerotate($src, -90, 0); 

EDIT Als Beispiel für meine nicht imagecolorset() in der Lage zu bekommen eine Änderung in der Datei zu machen, unten ist die Ausgabe von der Schleife auf $i:

1Array ([red] => 0 [green] => 0 [blue] => 1 [alpha] => 0) 1Array ([red] => 0 [green] => 0 [blue] => 1 [alpha] => 0) 1 
2Array ([red] => 0 [green] => 0 [blue] => 2 [alpha] => 0) 1Array ([red] => 0 [green] => 0 [blue] => 2 [alpha] => 0) 1 
3Array ([red] => 0 [green] => 0 [blue] => 3 [alpha] => 0) 1Array ([red] => 0 [green] => 0 [blue] => 3 [alpha] => 0) 1 

EDIT2

Ein wenig mehr Informationen: Ich überprüfte die gd-Versionen (php -i | grep -i gd). Ich bin überrascht, die Ubuntu-Box mit GD-Version 2.1.1-dev und die EC2-Box mit "gebündelt (2.1.0-kompatibel)" zu sehen. Ich bin neu bei GD, deshalb bin ich mehr geneigt zu glauben, dass dies meine Schuld ist, als dass Amazon eine schlechte Version von GD liefert.

EDIT3

  • Es scheint kein Speicherproblem zu sein. Die memory_get_peak_usage() meldet etwa 35 MB.

  • Der einzige Unterschied, den gd_info() meldet, ist die Versionsnummer.

Antwort

0

Diese Version von GD scheint einige Probleme zu haben. Es ist nicht perfekt, aber hier ist der endgültige Code, auf den wir uns festgelegt haben:

if ($isFileString) { 
     $im1 = imagecreatefromstring($data); 
    } else { 
     $im1 = imagecreatefromjpeg($data); 
    } 
    $tmp_file = $this->tmp_dir . md5(time() . mt_rand()); 
    imagepng($im1, $tmp_file); 
    imagedestroy($im1); 

    // rotate, pre-resize and resample the source image 
    $im2 = imagecreatefrompng($tmp_file); 
    unlink($tmp_file); 
    if (imagesy($im2) > imagesx($im2)) 
     $im2 = imagerotate($im2, $this->rotate, 0); 
    $width = imagesx($im2); 
    $height = imagesy($im2); 
    $percent = ($this->standard_width * 2)/$width; 
    $newWidth = $width * $percent; 
    $newHeight = $height * $percent; 
    $im = imagecreatetruecolor($newWidth, $newHeight); 
    imagecopyresampled($im, $im2, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 

    // create a transparent image with a size like $im image 
    $im3 = imagecreatetruecolor($newWidth, $newHeight); 
    imagesavealpha($im3, TRUE); 
    imagefill($im3, 0, 0, imagecolorallocatealpha($im3, 0, 0, 0, 127)); 

    // find non-white-ish pixels on $im and copy them to $dst 
    $sizeX = $newWidth; 
    $sizeY = $newHeight; 
    $startX = $startY = 100000; 
    $finishX = $finishY = 0; 
    for ($x = 1; $x < $sizeX - 1; $x++) { 
     for ($y = 1; $y < $sizeY - 1; $y++) { 
      $rgb = imagecolorat($im, $x, $y); 
      $colors = imagecolorsforindex($im, $rgb); 
      $r = $colors['red']; 
      $g = $colors['green']; 
      $b = $colors['blue']; 
      if ($r < $this->redLimit && $g < $this->greenLimit && $b < $this->blueLimit) { 
       imagesetpixel($im3, $x, $y, $rgb); 
       if ($startX > $x) { 
        $startX = $x; 
       } 
       if ($startY > $y) { 
        $startY = $y; 
       } 
       if ($finishX < $x) 
        $finishX = $x; 
       if ($finishY < $y) 
        $finishY = $y; 
      } 
     } 
    } 

    // final resize 
    $width = $finishX - $startX + 1; 
    $height = $finishY - $startY + 1; 
    $percent = $this->standard_width/$width; 
    $newWidth = $width * $percent; 
    $newHeight = $height * $percent; 
    $im4 = imagecreatetruecolor($newWidth, $newHeight); 
    imagesavealpha($im4, TRUE); 
    imagefill($im4, 0, 0, imagecolorallocatealpha($im4, 0, 0, 0, 127)); 
    imagecopyresampled($im4, $im3, 0, 0, $startX, $startY, $newWidth, $newHeight, $width, $height); 

    // returning image 
    ob_start(); 
    imagepng($im4); 
    $image_data = ob_get_contents(); 
    ob_end_clean(); 
    return $image_data; 
Verwandte Themen