2016-03-29 2 views
3

Ubuntuマシン(PHP 5.5.9)でGDを使用するPHPコードを書いて、Amazon Linux(PHP 5.5)を使用してamazon EC2に移動しました。 0.31)と私は(私だけimagecreatefromstring()を使用している同じ入力データファイルからコードとは全く異なる結果を得ている。$dataは、JPEGファイルの内容が含まれています)いくつかのImage/GD問題:クロッピング、色と透明度の設定

  1. 私はそれが希望のマシンを変更する前に。白を透明に変更します。それはもはやその変更を行いません。
  2. これはグラフィックを完全に切り抜くために使用されました。今は左に少し白い部分を残し、右に少しだけ画像を切り取っています。
  3. 左側に細い黒い線があります。
  4. imagecolorset()で画像の色を変えているように見えません。私は$iに以下のループから出力され、ファイルに変更を加えるためにimagecolorset()を取得することができないの例として

    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 :ここ

はコードです:

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

さらに詳しい情報:gdのバージョン(php -i | grep -i gd)を確認しました。私は、GDバージョン2.1.1-devのUbuntuボックスと、バンドルされた(2.1.0互換)EC2ボックスを見て驚いています。私はGDの新人だから、AmazonがGDの悪いバージョンを提供するのではなく、これが自分のせいだと思う方がもっと欲しい。

EDIT3

  • メモリの問題ではありません。 memory_get_peak_usage()は約35MBを報告します。

  • gd_info()の唯一の違いはバージョン番号です。

答えて

0

GDのバージョンに問題があるようです。完璧ではありませんが、最終的なコードは次のとおりです。

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; 
関連する問題