質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.51%

PHP gdを用いて画像のリサイズを行う(サイズの片方指定に対応したい)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,889

m.kosuda

score 77

閲覧頂きありがとうございます。
【概要】 
質問内容としてはタイトルの通りとなります。 
PHP GDを用いて、画像のリサイズを行いたい。詳細は以下。
・引数にwidthの指定のみの場合、縦横比を維持してwidth指定値でリサイズ。
・引数にheightの指定のみの場合、縦横比を維持してheight指定値でリサイズ。
【質問】
少々コードをおこしたのですが、以下のコードの場合、サイズの片方指定に対応できません。
(0を引数として渡すと比率算出時にエラーが出るため。)
サイズの片方指定に対応する場合はどのような考え方で処理を行うべきなのでしょうか?
本質問を解決するためのヒントを頂ければ幸いです。

function resizeImg($orig_file, $resize_width=0, $resize_height=0) {
    // GDライブラリがインストールされているか
    if ( !extension_loaded( 'gd' ) ) {
        // エラー処理
        return false;
    }

    // 画像情報取得
    $result = getimagesize( $orig_file );
    list( $orig_width, $orig_height, $image_type ) = $result;

    // 画像をコピー
    switch ($image_type) {
        // 1 IMAGETYPE_GIF
        // 2 IMAGETYPE_JPEG
        // 3 IMAGETYPE_PNG
        case 1 :$im = imagecreatefromgif( $orig_file );break;
        case 2 :$im = imagecreatefromjpeg( $orig_file );break;
        case 3 :$im = imagecreatefrompng( $orig_file );break;
        default : // エラー処理
            return false;
    }

    $ratio_orig = $orig_width / $orig_height;//元画像の比率計算
    /*画像の比率を計算する*/
    if ( ($resize_width/$resize_height) > $ratio_orig ) {
        $resize_width  = $resize_height * $ratio_orig;
    } else {
        $resize_height = $resize_width  / $ratio_orig;
    }

    // コピー先となる空の画像作成
    $new_image = imagecreatetruecolor( $resize_width, $resize_height );
    if ( !$new_image ) {
        // エラー処理
        // 不要な画像リソースを保持するメモリを解放する
        imagedestroy ( $im );
        return false;
    }

    // GIF、PNGの場合、透過処理の対応を行う
    if (($image_type == 1) || ($image_type == 3)) {
        imagealphablending ( $new_image, false );
        imagesavealpha( $new_image, true );
        $transparent = imagecolorallocatealpha ( $new_image, 255, 255, 255, 127 );
        imagefilledrectangle ( $new_image, 0, 0, $resize_width, $resize_height, $transparent );
    }

    // コピー画像を指定サイズで作成
    if ( !imagecopyresampled( $new_image, $im, 0, 0, 0, 0, $resize_width, $resize_height, $orig_width, $orig_height )) {
        // エラー処理
        // 不要な画像リソースを保持するメモリを解放する
        imagedestroy ( $im );
        imagedestroy ( $new_image );
        return false;
    }

    // コピー画像を保存
    // $new_image : 画像データ
    // $new_fname : 保存先と画像名
    // $quality   :クオリティ
    $new_fname = "保存先+ファイル名";
    $quality =80;
    switch ($image_type) {
        // 1 IMAGETYPE_GIF
        // 2 IMAGETYPE_JPEG
        // 3 IMAGETYPE_PNG
        case 1 :$result = imagegif( $new_image, $new_fname, $quality );break;
        case 2 :$result = imagejpeg( $new_image, $new_fname, $quality );break;
        case 3 :$result = imagepng( $new_image, $new_fname, $quality );break;
        default : // エラー処理
            return false;
    }

    // 作業用データ削除
    imagedestroy( $im );
    imagedestroy( $new_image );
    return $result;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

片方しか指定されて内場合、
もう片方を自動で算出すればいいんじゃないですかね。

800 x 600の画像を
横300で縦もアスペクト同じにリサイズにしたいなら、

300 / 800 = 0.375
600 * 0.375=225

と、高さを簡単に出せます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/29 15:28

    なるほどですね!
    早速、コードの改修をしたいと思います。
    ご回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る