0
0

More than 3 years have passed since last update.

php リサイズ

Last updated at Posted at 2020-09-08

画像を扱う前処理

resize.php
ImageCreateFromJPEG($filename)

これでメモリ(このプログラム内)の中で扱える

画像をリサイズ

resize.php
bool imagecopyresampled(resource $dst_image,resource $src_image,
int $dst_x,int $dst_y,int $src_x,int $src_y,int 
$dst_w,int $dst_h,int $src_w,int $src_h)

パラメータ
dst_image
コピー先の画像リンクリソース。
src_image
コピー元の画像リンクリソース。
dst_x
コピー先の x 座標。
dst_y
コピー先の y 座標。
src_x
コピー元の x 座標。
src_y
コピー元の y 座標。
dst_w
コピー先の幅。
dst_h
コピー先の高さ。
src_w
コピー元の幅。
src_h
コピー元の高さ。

返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。

画像を出力or 保存

resize.php
bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )

引数
image
画像リソースを指定します。

filename
画像リソースをファイルに保存する場合、ファイル名を指定します。
quality
画像のクオリティを0(低品質)から100(高品質)で指定します。デフォルトは75です。
返り値
画像の出力・作成に成功した場合は trueを、その他の場合は flaseを返します。

実際にリサイズ

resize.php
$filename = "画像パス"
if (mime_content_type($filename) == 'image/jpeg') {
          $image = ImageCreateFromJPEG($filename);
          $size = getimagesize($filename);
        }else {
          $image = ImageCreateFromPNG($filename);
          $size = getimagesize($filename);
        }



        //白紙の画像を作成
        $image2 = ImageCreateTrueColor(640, 480);
        //リサイズ処理
        imagecopyresampled($image2, $image, 0, 0, 0, 0, 640, 480, $size[0], $size[1]);

        //保存
        if (mime_content_type($filename) == 'image/jpeg') {
          imagejpeg($image2, $filename);
        }else {
          imagepng($image2, $filename);
        }

        //メモリ解放
        imagedestroy($image);

リサイズ問題

原寸は「横400px・縦180px」だが、横幅(widthプロパティに「200px」が指定された結果、縦横比を維持して高さは「90px」になる。
どちらかを指定すれば自動で、元画像の比率を保ったまま高さor横が決められる

resize.css
width: auto;

リサイズ計算式

元の画像の横:X1、縦:Y1
リサイズ後の画像の横:X2、縦:Y2
とした時、
X2を任意の値にした時に、アスペクト比を保った状態でのY2の値は
Y2=X2/X1*Y1

実践

resize.php
        //retinadisplay対応
        $resize_width = 462 * 2; //横幅決める
        $resize_height = $resize_width / $size[0] * $size[1]; //縦を比率崩さず出す
        //白紙の画像を作成
        $image2 = ImageCreateTrueColor($resize_width, $resize_height);
        //リサイズ処理
        imagecopyresampled($image2, $image, 0, 0, 0, 0, $resize_width, $resize_height, $size[0], $size[1]);

完成

resize.php

if (mime_content_type($filename) == 'image/jpeg') {
          $image = ImageCreateFromJPEG($filename);
          $size = getimagesize($filename);
        }else {
          $image = ImageCreateFromPNG($filename);
          $size = getimagesize($filename);
        }


        //retinadisplay対応
        $resize_width = 462 * 2; //横幅決める
        $resize_height = $resize_width / $size[0] * $size[1]; //縦を比率崩さず出す
        //白紙の画像を作成
        $image2 = ImageCreateTrueColor($resize_width, $resize_height);

        $x = 0;
        $y = 0;
        $x = floor(($size[0] - $size[1]) / 2);  //切り取るx軸の中心
        $y = floor(($size[1] - $size[0]) / 2);  //切り取るx軸の中心
        //リサイズ処理
        imagecopyresampled($image2, $image, 0, 0, $x, $y, $resize_width, $resize_height, $size[0], $size[1]);

        //保存
        if (mime_content_type($filename) == 'image/jpeg') {
          imagejpeg($image2, $filename);
        }else {
          imagepng($image2, $filename);
        }

        //メモリ解放
        imagedestroy($image);

参考:https://blog.ver001.com/php_image_resize_object-fit/
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11117777576
https://qiita.com/mikakane/items/290301a308277a384c2d
http://iekasegu.work/column.php?no=144

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0