1

パラメータに基づいてさまざまな方法で画像を処理する関数を作成しました。少し説明するために、関数にコメントがあります。

jpg画像を取得してpngとして保存する場合を除いて、すべてが機能します。imagepng()拡張子.jpgを使用して保存しても、画像は適切にサイズ変更された状態で表示されますが、拡張子は.jpgです。ただし、同じ .jpg 画像をアップロードし、それを使用imagepng()して .png 拡張子で保存すると、サイズ変更後に予想される幅と高さの画像が .png 形式で .png 拡張子で取得されます。画像全体が 100% 透明ですが、左上隅に 1 ピクセル x 1 ピクセルの黒いピクセルがあります。

誰かがこれを見て、私が見逃しているものがないかどうかを確認していただければ幸いです。1px X 1px は、 に使用するポイントから来ていると思いますが、imagefill()理由がわかりません。画像の残りの部分と同様に、すべて透明にする必要があります。

これが私の機能です:

if(!function_exists("upload")){
    //$image = $image file name
    //$width = intended width of resized image, if 0 it will proportion to height, overrides proportion
    //$height = intended width of resized image, if 0 it will proportion to width, overrides proportion
    //$proportion = 2,1,0;
    //------ 2 = Preserve proportions while adding a border to fill width and height  
    //------ 1 = retain proportion to fit within both given width and height
    //------ 0 = disregard proportions and resize to the exact width and height
    function upload($image, $width, $height, $proportion){
        // IS GD HERE?

        $gdv = get_gd_info();

        if (!$gdv){ 
            return FALSE;
        }

        // GET AN IMAGE THING

        $ext = trim(strtolower(end(explode('.', $image))));

        list($imageX, $imageY, $type) = getimagesize($image);   //gets information about new server image

        // GET THE LESSER OF THE RATIO OF THUMBNAIL H OR W DIMENSIONS
        $ratio_w = ($width / $imageX);
        $ratio_h = ($height / $imageY);
        $ratio   = ($ratio_w < $ratio_h) ? $ratio_w : $ratio_h;     

        if($width == 0){

            if($imageY > $height){
                $newHeight = $height;
                $newWidth = ($height/$imageY) * $imageX;    
            }else{
                $newHeight = $imageY;
                $newWidth = $imageX;    
            }

            $width = $newWidth;
            $height = $newHeight;

            // COMPUTE THUMBNAIL IMAGE CENTERING OFFSETS
            $fromMidX = 0;
            $fromMidY = 0;

        }elseif($height == 0){

            if ($imageX > $width){
                $newWidth = $width;
                $newHeight = ($width/$imageX) * $imageY;
            }else{
                $newHeight = $imageY;
                $newWidth = $imageX;    
            }

            $width = $newWidth;
            $height = $newHeight;

            // COMPUTE THUMBNAIL IMAGE CENTERING OFFSETS
            $fromMidX = 0;
            $fromMidY = 0;

        }elseif($proportion == 2){

            // COMPUTE THUMBNAIL IMAGE DIMENSIONS
            $newWidth = $imageX * $ratio;
            $newHeight = $imageY * $ratio;

            // COMPUTE THUMBNAIL IMAGE CENTERING OFFSETS
            $fromMidX = ($width - $newWidth) / 2.0;
            $fromMidY = ($height - $newHeight) / 2.0;

        }elseif($proportion == 1){

            if ($imageX > $width){
                $newHeight = ($width/$imageX) * $imageY;
                $newWidth = $width;
            }
            if ($imageY > $height){
                $newHeight = $height;
                $newWidth = ($height/$imageY) * $imageX;
            }

            $fromMidY = 0;
            $fromMidX = 0;

        }elseif($proportion == 0){

            $newWidth = $width;
            $newHeight = $height;

            $fromMidY = 0;
            $fromMidX = 0;          
        }

        switch(strtoupper($ext))
        {
            case 'JPG' :
            case 'JPEG' :
                $source = imagecreatefromjpeg($image);
                break;

            case 'PNG' :
                $source = imagecreatefrompng($image);

                break;

            default : die("UNKNOWN IMAGE TYPE: $image");
        }

        // WHICH FUNCTIONS CAN RESIZE / RESAMPLE THE IMAGE?
        if ($gdv >= 2)
        {

            // IF GD IS AT LEVEL 2 OR ABOVE
            $target = imagecreatetruecolor($width, $height);
            $color = imagecolorallocatealpha($target, 0, 0, 0, 127); 

            imagefill($target, 0, 0, $color);

            imagesavealpha($target, TRUE);


            imagecopyresampled ($target, $source, $fromMidX, $fromMidY, 0, 0, $newWidth, $newHeight, $imageX, $imageY);

        }
        else
        {
            // IF GD IS AT A LOWER REVISION LEVEL
            $target = imagecreate($width, $height);
            imagesavealpha($target, TRUE);
                $empty = imagecolorallocatealpha($thumb,0x00,0x00,0x00,127);
                imagefill($target, 0, 0, $empty);
            imagecopyresized($target, $source, $fromMidX, $fromMidY, 0, 0, $newWidth, $newHeight, $imageX, $imageY);
        }

        // SHARPEN THE PIC
        $sharpenMatrix = array
        ( array( -1.2, -1, -1.2 )
        , array( -1,   20, -1 )
        , array( -1.2, -1, -1.2 )
        )
        ;
        $divisor = array_sum(array_map('array_sum', $sharpenMatrix));
        $offset  = 0;
        imageconvolution($target, $sharpenMatrix, $divisor, $offset);

        if(imagepng($target, $image,9)){

            imagedestroy($target);
        }else{

        }

        return $image;  
    }
}

編集 1: .jpg 画像 (例: 100px X 200px) をアップロードし、それらを .png (例: 400px X 200px) に変換していることに注意する必要があったと思いますが、画像の比率を保持して完全に収まるようにしています宛先 .png の中心。したがって、中央に画像があり、左右に100pxの400px X 200pxの.pngがあり、透明にする必要があります。このようにして、塗りつぶしとして単色なしでスライダーにうまく収まります。したがって、関数への呼び出しの例は次のようになりますupload($image, 400, 200, 2)

4

1 に答える 1

0

私は問題が何であるかを理解しました。MIMEタイプではなく、渡された画像の拡張子を使用する必要があるか、誤って外れるimagecreatefromjpegかを決定するコードの部分。imagecreatefrompng私はこれに切り替えました:

switch($type)
        {
            case '2' :
                $source = imagecreatefromjpeg($image);
                break;
            case '3' :
                $source = imagecreatefrompng($image);
                break;
            default : die("UNKNOWN IMAGE TYPE: $image");
        }

私がそこに持っていた行からどこ$typeに来ていますか

list($imageX, $imageY, $type) = getimagesize($image);

したがって、機能は次のとおりです。

if(!function_exists("upload")){
    //$image = $image file name
    //$width = intended width of resized image, if 0 it will proportion to height, overrides proportion
    //$height = intended width of resized image, if 0 it will proportion to width, overrides proportion
    //$proportion = 2,1,0;
    //------ 2 = Preserve proportions while adding a border to fill width and height  
    //------ 1 = retain proportion to fit within both given width and height
    //------ 0 = disregard proportions and resize to the exact width and height


    function upload($image, $width, $height, $proportion){
        // IS GD HERE?

        $gdv = get_gd_info();

        if (!$gdv){ 
            return FALSE;
        }

        // GET AN IMAGE THING

        $ext = trim(strtolower(end(explode('.', $image))));

        list($imageX, $imageY, $type) = getimagesize($image);   //gets information about new server image

        // GET THE LESSER OF THE RATIO OF THUMBNAIL H OR W DIMENSIONS
        $ratio_w = ($width / $imageX);
        $ratio_h = ($height / $imageY);
        $ratio   = ($ratio_w < $ratio_h) ? $ratio_w : $ratio_h;     

        if($width == 0){

            if($imageY > $height){
                $newHeight = $height;
                $newWidth = ($height/$imageY) * $imageX;    
            }else{
                $newHeight = $imageY;
                $newWidth = $imageX;    
            }

            $width = $newWidth;
            $height = $newHeight;

            // COMPUTE THUMBNAIL IMAGE CENTERING OFFSETS
            $fromMidX = 0;
            $fromMidY = 0;

        }elseif($height == 0){

            if ($imageX > $width){
                $newWidth = $width;
                $newHeight = ($width/$imageX) * $imageY;
            }else{
                $newHeight = $imageY;
                $newWidth = $imageX;    
            }

            $width = $newWidth;
            $height = $newHeight;

            // COMPUTE THUMBNAIL IMAGE CENTERING OFFSETS
            $fromMidX = 0;
            $fromMidY = 0;

        }elseif($proportion == 2){

            // COMPUTE THUMBNAIL IMAGE DIMENSIONS
            $newWidth = $imageX * $ratio;
            $newHeight = $imageY * $ratio;

            // COMPUTE THUMBNAIL IMAGE CENTERING OFFSETS
            $fromMidX = ($width - $newWidth) / 2.0;
            $fromMidY = ($height - $newHeight) / 2.0;

        }elseif($proportion == 1){

            if ($imageX > $width){
                $newHeight = ($width/$imageX) * $imageY;
                $newWidth = $width;
            }
            if ($imageY > $height){
                $newHeight = $height;
                $newWidth = ($height/$imageY) * $imageX;
            }

            $fromMidY = 0;
            $fromMidX = 0;

        }elseif($proportion == 0){

            $newWidth = $width;
            $newHeight = $height;

            $fromMidY = 0;
            $fromMidX = 0;          
        }

        switch($type)
        {
            case '2' :
                $source = imagecreatefromjpeg($image);
                break;
            case '3' :
                $source = imagecreatefrompng($image);
                break;
            default : die("UNKNOWN IMAGE TYPE: $image");
        }

        // WHICH FUNCTIONS CAN RESIZE / RESAMPLE THE IMAGE?
        if ($gdv >= 2)
        {

            // IF GD IS AT LEVEL 2 OR ABOVE
            $target = imagecreatetruecolor($width, $height);
            $color = imagecolorallocatealpha($target, 0, 0, 0, 127); 
            imagefill($target, 0, 0, $color);
            imagesavealpha($target, TRUE);
            imagecopyresampled ($target, $source, $fromMidX, $fromMidY, 0, 0, $newWidth, $newHeight, $imageX, $imageY);

        }
        else
        {
            // IF GD IS AT A LOWER REVISION LEVEL
            $target = imagecreate($width, $height);
            imagesavealpha($target, TRUE);
                $empty = imagecolorallocatealpha($thumb,0x00,0x00,0x00,127);
                imagefill($target, 0, 0, $empty);
            imagecopyresized($target, $source, $fromMidX, $fromMidY, 0, 0, $newWidth, $newHeight, $imageX, $imageY);
        }

        // SHARPEN THE PIC
        $sharpenMatrix = array
        ( array( -1.2, -1, -1.2 )
        , array( -1,   20, -1 )
        , array( -1.2, -1, -1.2 )
        )
        ;
        $divisor = array_sum(array_map('array_sum', $sharpenMatrix));
        $offset  = 0;
        imageconvolution($target, $sharpenMatrix, $divisor, $offset);

        if(imagepng($target, $image,9)){
            imagedestroy($target);
        }
        return $image;
    }
}

呼び出しの例は次のとおりです。upload("path/to/image/on/server.png", 400, 200, 2) イメージ パスは jpg または png MIME タイプのいずれかです。ただし、拡張子は .png でなければなりません。拡張機能を使用できる場合はよりスマートにできると思いますが、この関数を使用する現在のコードでは、そのままにしておく方が理にかなっています。最終的には、透明度をオンまたはオフにするオプションを追加し、必要に応じて黒などの単色を使用したいと考えています。これを自由に使用および変更してください。

ここでこれに使用する予定の素敵な hex2rgb/rgb2hex 関数があります

于 2013-01-11T14:59:24.307 に答える