2

私はphpnoobで、アップロードされた画像をより小さなサイズに縮小する画像サイズ変更スクリプトを作成しようとしています。以下の現在のスクリプトを使用すると、元の画像が表示されます。新しい幅と高さは登録されていないようです。どんな助けでも大歓迎です。

    <?php

    if ($_SERVER['REQUEST_METHOD']=='POST') {
      if (isset($_FILES['image']['tmp_name'])) {
        if ($_FILES['image']['error']==0){
        $new_dir = '/PHP_MySQL_Practice/uploaded/images';
        $fullpath = $_SERVER['DOCUMENT_ROOT'].$new_dir;
        if(!is_dir($fullpath)) {
            mkdir($fullpath, 0777, TRUE); 
        }
        //get file name and type(extension)
        $name = $_FILES['image']['name'];
        $type = $_FILES['image']['type'];

        //separate image name after first "dot"
        $separated = explode(".", $name);
        //get string before the dot which was stored as the 1st item in the separated array.
        $first = $separated[0];
        //use php function pathinfo to get extension of image file
        $ext = pathinfo($name, PATHINFO_EXTENSION);
        //concatenate current timestamp (to avoid file overwrites) with the extracted file 'firstname' and add the extension
        $name = time().'_'.$first.'.'.$ext;
        $target = $fullpath.'/'.$name;

        if (move_uploaded_file($_FILES['image']['tmp_name'], $target)) {

            resizeImage($target, $name);
            echo '<img src="' . $target . '"/>';

        }

    }
    else {

        echo 'there was an error in saving ur image file.';
    }
}   
else {

    echo 'ur image could not be uploaded.';
}
    }
    else {
    ?>
<form method="POST" enctype="multipart/form-data">
    <label>upload image: </label>
    <input type="file" name="image" />
    <input type="submit" />
</form> 
    <?php   
    }

    //function to resize image
    function resizeImage($dir, $img) {
list($src_w, $src_h) = getimagesize($dir);
$max_w = 150;
$max_h = 150;
if ($src_w > $max_w) {
    $ratio = $max_w / $src_w;
    $new_img_w = $src_w * $ratio;
}
else if ($src_h > $max_h) {
    $ratio = $max_h / $src_h;
    $new_img_h = $src_h * $ratio;
}
$img_mime_type = getimagesize($dir);
switch ($img_mime_type['mime']) {
    case 'image/jpeg':
    case 'image/pjpeg':
        $src = imagecreatefromjpeg($dir);
        return $src;
        break;
    case 'image/gif':
        $src = imagecreatefromgif($dir);
        return $src;
        break;
    case 'image/png':
        $src = imagecreatefrompng($dir);
        return $src;
        break;
    default:
        return FALSE;
        break;
}
$new_img = imagecreatetruecolor($new_img_w, $new_img_h);
imagecopyresampled($new_img, $src, 0, 0, 0, 0, $new_img_w, $new_img_h, $max_w, $max_h);
switch ($img_mime_type['mime']) {
    case 'image/jpeg':
    case 'image/pjpeg':
        imagejpeg($new_img, $dir, 100);
        break;
    case 'image/gif':
        imagegif($new_img, $dir);
        break;
    case 'image/png':
        imagepng($new_img, $dir);
        break;
    default:
        return FALSE;
        break;
}

imagedestroy($src);
imagedestroy($new_img);
    }
    ?>
4

4 に答える 4

3

そこにはいくつかの欠陥があります

  1. imagegif2つのパラメータ$imと保存場所しかありません
  2. imagepng100 ではなく 0 から 9 までの圧縮レベルがあります
  3. 画像を保存していません。nullfromimagejpeg($new_img, null, 100);を変更する必要があります$dir
  4. あなたの最後の機能imagdestroy($src);は間違っています、そうあるべきですimagedestroy($src);

あなたのswitchはずです:

switch ($img_mime_type['mime']) {
    case 'image/jpeg':
    case 'image/pjpeg':
        imagejpeg($new_img, $dir, 100);
        break;
    case 'image/gif':
        imagegif($new_img, $dir);
        break;
    case 'image/png':
        imagepng($new_img, $dir);
        break;
    default:
        return FALSE;
        break;
}

あなたのサイズ変更機能:

function resizeImage($dir, $img) {
    //echo $dir; die;
    list($src_w, $src_h) = getimagesize($dir);
    $max_w = 150;
    $max_h = 150;
    if ($src_w > $max_w) {
        $ratio = $max_w / $src_w;
        $max_w = $src_w * $ratio;
    }
    else if ($src_h > $max_h) {
        $ratio = $max_h / $src_h;
        $max_h = $src_h * $ratio;
    }
    $img_mime_type = getimagesize($dir);
    $src = imagecreatefromstring(file_get_contents($dir));
    $new_img = imagecreatetruecolor($max_w, $max_h);
    imagecopyresampled($new_img, $src, 0, 0, 0, 0, $max_w, $max_h, $src_w, $src_h);
    switch ($img_mime_type['mime']) {
        case 'image/jpeg':
        case 'image/pjpeg':
            imagejpeg($new_img, $dir, 100);
            break;
        case 'image/gif':
            imagegif($new_img, $dir);
            break;
        case 'image/png':
            imagepng($new_img, $dir);
            break;
        default:
            return FALSE;
            break;
    }

    imagedestroy($src);
    imagedestroy($new_img);
}
于 2012-09-10T05:11:12.270 に答える
0

この機能を試してみてください...

この関数には、画像のサイズを比例して変更できる可能性が合計3つあるため、要件に応じて高さと幅を渡すことができます。

  1. 高さが幅よりも大きい場合は、高さに合わせてサイズを変更する必要があります。
  2. 幅が幅よりも大きい場合は、幅に合わせてサイズを変更する必要があります。
  3. 高さと幅の両方でサイズを変更します。

ここに例があります、

//first of all get Height and width of image 

 function getHeight($image) {
    $sizes = getimagesize($image);
    $height = $sizes[1];
    return $height;
}

//You do not need to alter these functions
function getWidth($image) {
    $sizes = getimagesize($image);
    $width = $sizes[0];
    return $width;
}

ここで希望のサイズにサイズ変更します500pxで作業しています(高さと幅の両方)

    $width = $this->getWidth($fullpath);
    $height = $this->getHeight($fullpath);

     $profilecroppedthumb = UPLOAD_PATH."FILENAME_WITH_EXTENSION";
     $fullpath = $uploadDirectory.$filename.'.'.$ext;

        if ($width >= 500 && $height >= 500) {
            thumb($fullpath, $profilecroppedthumb, "500", "500");
        }
        elseif($width >= 500 && $height <= 500)
        {
            thumb($fullpath, $profilecroppedthumb, "500", "");
        } 
        elseif($width <= 500 && $height >= 500)
        {
            thumb($fullpath, $profilecroppedthumb, "", "500");
        }
        else
        {
            $target = fopen($profilecroppedthumb, "w");
            fseek($temp, 0, SEEK_SET);
            stream_copy_to_stream($temp, $target);
            fclose($target);
        } 
 function thumb($file, $save, $width="", $height="")
{   
    //GD-Lib > 2.0 only!
    //@unlink($save);

    //get sizes else stop

    if (!$infos = @getimagesize($file)) {
    //echo $infos = @getimagesize($file); exit('saf');
        return false;
    }

    // keep proportions
    $iWidth = $infos[0];
    $iHeight = $infos[1];
    $iRatioW = $width / $iWidth;
    $iRatioH = $height / $iHeight;


    if($height == "" ) {
        if ($iRatioW < $iRatioH) {
                $iNewW = $iWidth * $iRatioW;
                $iNewH = $iHeight * $iRatioW;
            } else {
                $iNewW = $iWidth * $iRatioW;
                $iNewH = $iHeight * $iRatioW;
            }
    }
    elseif ($width == "")
    {
    if ($iRatioW < $iRatioH) {
                $iNewW = $iWidth * $iRatioH;
                $iNewH = $iHeight * $iRatioH;
            } else {
                $iNewW = $iWidth * $iRatioH;
                $iNewH = $iHeight * $iRatioH;
            }
    }
    else 
    {
        if ($iRatioW < $iRatioH) {
            $iNewW = $iWidth * $iRatioW;
            $iNewH = $iHeight * $iRatioW;
        } else {

            $iNewW = $iWidth * $iRatioH;
            $iNewH = $iHeight * $iRatioH;


        }
    }
    //$iNewW = $width;
    //$iNewH = $height;

    //Don't resize images which are smaller than thumbs
    if ($infos[0] < $width && $infos[1] < $height) {
        $iNewW = $infos[0];
        $iNewH = $infos[1];
    }

    if($infos[2] == 1) {
        /*
        * Image is typ gif
        */
        $imgA = imagecreatefromgif($file);
        $imgB = imagecreate($iNewW,$iNewH);

        //keep gif transparent color if possible
        if(function_exists('imagecolorsforindex') && function_exists('imagecolortransparent')) {
            $transcolorindex = imagecolortransparent($imgA);
                //transparent color exists
                if($transcolorindex >= 0 ) {
                    $transcolor = imagecolorsforindex($imgA, $transcolorindex);
                    $transcolorindex = imagecolorallocate($imgB, $transcolor['red'], $transcolor['green'], $transcolor['blue']);
                    imagefill($imgB, 0, 0, $transcolorindex);
                    imagecolortransparent($imgB, $transcolorindex);
                //fill white
                } else {
                    $whitecolorindex = @imagecolorallocate($imgB, 255, 255, 255);
                    imagefill($imgB, 0, 0, $whitecolorindex);
                }
        //fill white
        } else {
            $whitecolorindex = imagecolorallocate($imgB, 255, 255, 255);
            imagefill($imgB, 0, 0, $whitecolorindex);
        }
        imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW, $iNewH, $infos[0], $infos[1]);
        imagegif($imgB, $save);        

    } elseif($infos[2] == 2) {
        /*
        * Image is typ jpg

        */
        $imgA = imagecreatefromjpeg($file);
        $imgB = imagecreatetruecolor($iNewW,$iNewH);
        imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW, $iNewH, $infos[0], $infos[1]);
        imagejpeg($imgB, $save,100);

    } elseif($infos[2] == 3) {
        /*
        * Image is typ png
        */
        $imgA = imagecreatefrompng($file);
        $imgB = imagecreatetruecolor($iNewW, $iNewH);
        imagealphablending($imgB, false);
        imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW, $iNewH, $infos[0], $infos[1]);
        imagesavealpha($imgB, true);
        imagepng($imgB, $save,100);
    } else {
        return false;
    }

    return true;
}

この助けを願っています...

于 2012-09-10T05:57:46.430 に答える
0

画像を保存するのではなく、画像の内容を出力しています。imagejpeg のドキュメントを確認すると、2 番目の引数が画像を保存するパスであることがわかります。したがって、2 番目の引数 (null) を、サイズ変更した画像を保存する場所に変更します。

于 2012-09-10T05:09:37.557 に答える
0

以下の関数を使用して画像のサイズを変更します

function image_resize($image, $maxWidth, $maxHeight = null)
{
        $file = $image;
        $file_headers = @get_headers($file);

        //validate file not exists
        if( isset($file_headers[0]) && strpos($file_headers[0], '404') ) {
            return;
        }

    $arrayUploadPath = wp_upload_dir();
    $fileUploadSubDir = str_replace(basename($image),'', str_replace($arrayUploadPath['baseurl'], '', $image));
    $fileUploadDir = $arrayUploadPath['basedir'] . $fileUploadSubDir;

    //validate sour ce file existance
    if(!file_exists($fileUploadDir . basename($src))) return null;

    $fileUploadUrl = $arrayUploadPath['baseurl'] . $fileUploadSubDir;
    $srcFileName = $fileUploadDir . basename($image);
    $srcSize = getimagesize($srcFileName);
    $width = $srcSize[0];
    $height = $srcSize[1];

    if( empty($maxHeight) ) {
        $size = wp_constrain_dimensions($width, $height, $maxWidth);
        $maxHeight = $size[1];
    }

    //fix for image_resize_dimensions() constraint in image_resize() function
    if($maxHeight >= $height) $maxHeight = $height - 1;

    $newImage = image_resize($srcFileName, $maxWidth, $maxHeight);

    $newFileNameUrl = !empty($newImage) && !is_object($newImage) ? $fileUploadUrl . basename($newImage) : null;

    return $newFileNameUrl;
}
于 2012-09-10T05:13:42.673 に答える