2011-12-18 17 views
0

私は先日ここに来た画像のサイズを変更する方法を使用しています。これは処理する最初の画像ではうまく機能しますが、親指の爪に使用する小さな画像を作成します。この第2のサムネイルが作成されると、透明でなければならない黒い背景が出てきます。私はこれが共通の問題であることを知っています。私はここに同様の苦情を伴うスレッドをたくさん見てきました。私はPHPのエラーログに最後の夜を探していたとき、それはそのimagecoloratが範囲外だったピクセルをヒットしようとしていたと言っていた.....PHP - 小さな画像で透明度の問題

PHP Notice: imagecolorat(): 0,28 is out of bounds in C:\inetpub\ 

少なくとも私が起こっていただきました!知っているが、私は知っておくべきこと今それを修正する方法です。本当に変わったのは、同じイメージの大きなコピーでは、このエラーが発生せず、大きなアップロードされたコピーの素敵なコピーを作成するだけです。私はすべてが最初の実行のためにそれオナラセカンドランで、何らかの理由で正常に動作し、境界エラーのうちをスロー言ったように

$image_source = imagecreatefromstring($markericon); //original image 

    $imgHead = "image/jpeg"; //tag for image to be pulled later. images go in are png's 

//code to make sure image is never larger than certain size 
    $image_width = imagesx($image_source); 
    $image_height =  imagesy($image_source); 


    if($image_width>$max_upload_large_side || $image_height >$max_upload_large_side){ 
     $proportionslarge = $image_width/$image_height; 

     if($image_width>$image_height){ 
      $new_large_width = $max_upload_large_side; 
      $new_large_height = round($max_upload_large_side/$proportionslarge); 
     }  
     else{ 
      $new_large_height = $max_upload_large_side; 
      $new_large_width = round($max_upload_large_side*$proportionslarge); 
     }  

     $new_large_image = imagecreatetruecolor($new_large_width , $new_large_height); 

//code used to retain image transparency 


     //over write alpha chanel of image destination 
     imagealphablending($new_large_image, false); // Overwrite alpha 
     imagesavealpha($new_large_image, true); 

     // Create a separate alpha channel to blend images with 
     $alpha_image = imagecreatetruecolor($image_width, $image_height); 
     imagealphablending($alpha_image, false); // Overwrite alpha 
     imagesavealpha($alpha_image, true); 

     //copy data at every pixel in image 
     for ($x = 0; $x < $image_width; $x++) { 
     for ($y = 0; $y < $image_height; $y++) { 
     $alpha = (imagecolorat($image_source, $x, $y) >> 24) & 0xFF; 
     $color = imagecolorallocatealpha($alpha_image, 0, 0, 0, $alpha); 
     imagesetpixel($alpha_image, $x, $y, $color); 
            } 
            } 

     // Resize image to destination, using gamma correction 
     imagegammacorrect($image_source, 2.2, 1.0); 
     imagecopyresampled($new_large_image, $image_source, 0, 0, 0, 0, $new_large_width, $new_large_height, $image_width, $image_height); 
     imagegammacorrect($new_large_image, 1.0, 2.2); 

     // Resize alpha channel 
     $alpha_resized_image = imagecreatetruecolor($new_large_width, $new_large_height); 
     imagealphablending($alpha_resized_image, false); 
     imagesavealpha($alpha_resized_image, true); 

     imagecopyresampled($alpha_resized_image, $alpha_image, 0, 0, 0, 0, $new_large_width, $new_large_height, $image_width, $image_height); 

     // Copy alpha channel back to resized image 
     for ($x = 0; $x < $new_large_width; $x++) { 
     for ($y = 0; $y < $new_large_height; $y++) { 
     $alpha = (imagecolorat($alpha_resized_image, $x, $y) >> 24) & 0xFF; 
     $rgb = imagecolorat($new_large_image, $x, $y); 
     $r = ($rgb >> 16) & 0xFF; 
     $g = ($rgb >> 8) & 0xFF; 
     $b = $rgb & 0xFF; 
     $color = imagecolorallocatealpha($new_large_image, $r, $g, $b, $alpha); 
     imagesetpixel($new_large_image, $x, $y, $color); 
      } 
      } 



     // end of first run// 

     ob_start(); // Start capturing stdout. 
     imagePNG($new_large_image); 
     $lBinaryThumbnail = ob_get_contents(); // the raw jpeg image data. 
     ob_end_clean(); // Dump the stdout so it does not screw other output. 
     $lBinaryThumbnail = addslashes($lBinaryThumbnail); 
     imagedestroy($new_large_image);   
    } else $lBinaryThumbnail = $imgData; 


//start of second image run 
    if($image_width>$max_upload_small_side || $image_height >$max_upload_small_side){ 
     $proportionssmall = $image_width/$image_height; 

     if($image_width>$image_height){ 
      $new_small_width = $max_upload_small_side; 
      $new_small_height = round($max_upload_small_side/$proportionssmall); 
     }  
     else{ 
      $new_small_height = $max_upload_small_side; 
      $new_small_width = round($max_upload_small_side*$proportionssmall); 
     }  

     $new_small_image = imagecreatetruecolor($new_small_width , $new_small_height); 

     ////////////////////////////////////////////////////////////////////////////////// 

     //over write alpha chanel of image destination 
     imagealphablending($new_small_image, false); // Overwrite alpha 
     imagesavealpha($new_small_image, true); 

     // Create a separate alpha channel to blend images with 
     $alpha_image = imagecreatetruecolor($image_width, $image_height); 
     imagealphablending($alpha_image, false); // Overwrite alpha 
     imagesavealpha($alpha_image, true); 

     //copy data at every pixel in image 
     for ($x = 0; $x < $image_width; $x++) { 
     for ($y = 0; $y < $image_height; $y++) { 
     $alpha = (imagecolorat($image_source, $x, $y) >> 24) & 0xFF; 
     $color = imagecolorallocatealpha($alpha_image, 0, 0, 0, $alpha); 
     imagesetpixel($alpha_image, $x, $y, $color); 
            } 
            } 

     // Resize image to destination, using gamma correction 
     imagegammacorrect($image_source, 2.2, 1.0); 
     imagecopyresampled($new_small_image, $image_source, 0, 0, 0, 0, $new_small_width , $new_small_height, $image_width, $image_height); 
     imagegammacorrect($new_small_image, 1.0, 2.2); 

     // Resize alpha channel 
     $alpha_resized_image = imagecreatetruecolor($image_width, $image_height); 
     imagealphablending($alpha_resized_image, false); 
     imagesavealpha($alpha_resized_image, true); 

     imagecopyresampled($alpha_resized_image, $alpha_image, 0, 0, 0, 0, $new_small_width ,$new_small_height, $image_width, $image_height); 

     // Copy alpha channel back to resized image 
     for ($x = 0; $x < $new_small_width; $x++) { 
     for ($y = 0; $y < $new_small_height; $y++) { 
     $alpha = (imagecolorat($alpha_resized_image, $x, $y) >> 24) & 0xFF; 
     $rgb = imagecolorat($new_small_image, $x, $y); //this is the line that throws the error first and gives a out of bounds related error. 
     $r = ($rgb >> 16) & 0xFF; 
     $g = ($rgb >> 8) & 0xFF; 
     $b = $rgb & 0xFF; 
     $color = imagecolorallocatealpha($new_small_image, $r, $g, $b, $alpha); 
     imagesetpixel($new_small_image, $x, $y, $color); 
      } 
      } 



     // end of new code // 
     //imagecopyresampled($new_small_image, $image_source, 0, 0, 0, 0, $new_small_width, $new_small_height, $image_width, $image_height); 

     ob_start(); // Start capturing stdout. 
     imagePNG($new_small_image); 
     $sBinaryThumbnail = ob_get_contents(); // the raw jpeg image data. 
     ob_end_clean(); // Dump the stdout so it does not screw other output. 
     $sBinaryThumbnail = addslashes($sBinaryThumbnail); 
     imagedestroy($new_small_image);   
    } else $sBinaryThumbnail = $lBinaryThumbnail; 



    imagedestroy($image_source); 

:相続人はImが使用したコードは、すべてのサイズを変更します。 0,28で始まり、ループ処理が終了するまで50,50

答えて

0

私はそれを理解しました。私は上のコードを取り上げてアルファベットのコピーを作成し、それをすべて今はうまく動作します。