PHP - 小さな画像での透明性の問題

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

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

少なくとも私は何が起こっているのか知っていますが、今私が知る必要があるのはそれを修正する方法です。本当に変わったのは、同じイメージの大きなコピーでは、このエラーが発生せず、大きなアップロードされたコピーの素敵なコピーを作成するだけです。 Imがすべてのサイズを変更するために使用するコードをHeres:

 $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);

私はすべてが最初の実行のためにうまく動作すると言ったように、しかし、2回目の実行で何らかの理由でそれはおならになり、範囲外のエラーがスローされます。それは0.28で始まり、50,50でループ処理が終了するまで続きます

0

1 答え

私はそれを理解しました:)私は、上記のアルファ正しいコピーを作成し、それをすべて自分の関数に変えたコードを取りましたが、今はうまく動作します。

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com