ショコラ
PHP 画像を正方形の枠いっぱいにリサイズするには?
きっと調べれば色々出てくると思いますが、今回は昔作った Imgeクラス を使ってみようと思います。
resize_squareメソッドを使います。こういう要望は時々あります。
もっさん先輩
こちらのリンクを右クリックしてファイルをダウンロードできます。
curl -LO https://answorz.com/10025/Image.php
<?php
declare(strict_types=1);
class Image
{
private $resource = null;
private int $bgcolor;
public function __construct( string $filepath = '' )
{
if ('' != $filepath)
$this->open($filepath);
$this->set_bgcolor_transparent();
}
public function __destruct()
{
$this->close();
}
public function create( int $width, int $height ):self
{
$this->resource = imagecreatetruecolor($width,$height);
return $this;
}
// 画像を開く
public function open( string $filepath ):self
{
$this->close();
$this->resource = null;
if (false !== getimagesize($filepath)) {
exif_imagetype($filepath);
$resource = match (exif_imagetype($filepath)) {
1 => imageCreateFromGif($filepath),
2 => imageCreateFromJpeg($filepath),
3 => imageCreateFromPng($filepath),
6 => imageCreateFromBmp($filepath),
};
if (!is_null($resource)) {
$this->resource = $resource;
}
}
return $this;
}
public function close():self
{
if (!is_null($this->resource))
imagedestroy($this->resource);
return $this;
}
public function getResource()
{
return $this->resource;
}
// 画像を保存
public function save( string $filepath, int $quality = 100 ):self
{
$png_quality = intval(round(($quality - 100) / 11.111111));
match (pathinfo($filepath,PATHINFO_EXTENSION)) {
'jpeg','jpg' => imagejpeg($this->resource,$filepath,$quality),
'png' => imagepng($this->resource,$filepath,$png_quality),
'gif' => imagegif($this->resource,$filepath),
'bmp' => imagebmp($this->resource,$filepath),
};
return $this;
}
// 画像を出力
public function __toString():string
{
ob_start();
imagejpeg($this->resource,null,100);
$data = ob_get_contents();
ob_end_clean();
return ('' == $data) ? '' : 'data:image/jpeg;base64,'.base64_encode($data);
}
// 画像をリサイズ(正方形)
public function resize_square( $length ):self
{
$left = $top = 0;
if ($this->get_width() > $this->get_height()) {
$this->resize($length,0);
$top = intval(($length - $this->get_height()) / 2);
}
else {
$this->resize(0,$length);
$left = intval(($length - $this->get_width()) / 2);
}
$width = $this->get_width();
$height = $this->get_height();
$old_resource = $this->resource;
$this->create($length,$length)->fill($this->bgcolor);
imagecopy($this->resource,$old_resource,$left,$top,0,0,$width,$height);
imagedestroy($old_resource);
return $this;
}
// 画像をリサイズ
public function resize( int $width = 0, int $height = 0 ):self
{
$old_width = $this->get_width();
$old_heigth = $this->get_height();
if (0 == $width && 0 != $height) {
$width = intval(round(($height / $old_heigth) * $old_width));
}
else if (0 == $height && 0 != $width) {
$height = intval(round(($width / $old_width) * $old_heigth));
}
$old_resource = $this->resource;
$this->create($width,$height);
imagecopyresampled($this->resource,$old_resource,0,0,0,0,$width,$height,$old_width,$old_heigth);
imagedestroy($old_resource);
return $this;
}
// 画像を切り抜く
public function trim( int $top = 0, int $right = 0, int $bottom = 0, int $left = 0 ):self
{
$width = $this->get_width() - $left - $right;
$height = $this->get_height() - $top - $bottom;
$old_resource = $this->resource;
$this->create($width,$height);
imagecopy($this->resource,$old_resource,0,0,$left,$top,$width,$height);
imagedestroy($old_resource);
return $this;
}
// 画像をコピー
public function copy( Image $img, int $dx = 0 , int $dy =0 ):self
{
imagecopy($this->resource,$img->get_resource(),$dx,$dy,0,0,$img->get_width(),$img->get_height());
return $this;
}
// 画像を回転
public function rotate( float $angle ):self
{
$old_resource = $this->resource;
$this->resource = imagerotate($this->resource,$angle,$this->bgcolor,0);
imagedestroy($old_resource);
return $this;
}
// 画像を反転
public function flip( int $mode ):self
{
imageflip($this->resource,$mode);
return $this;
}
// 画像を塗りつぶす
public function fill( int $color ):self
{
imagefill($this->resource,0,0,$color);
return $this;
}
public function get_resource()
{
return $this->resource;
}
public function get_width():int
{
return imagesx($this->resource);
}
public function get_height():int
{
return imagesy($this->resource);
}
public function set_bgcolor( int $bgcolor ):self
{
$this->bgcolor = $bgcolor;
return $this;
}
// 背景を透明にする
public function set_bgcolor_transparent():self
{
$this->bgcolor = imagecolorallocatealpha($this->resource,0,0,0,127);
return $this;
}
// 背景を白にする
public function set_bgcolor_white():self
{
$this->bgcolor = imagecolorallocatealpha($this->resource,255,255,255,0);
return $this;
}
// 背景を黒にする
public function set_bgcolor_black():self
{
$this->bgcolor = imagecolorallocatealpha($this->resource,0,0,0,0);
return $this;
}
public function get_bgcolor():int
{
return $this->bgcolor;
}
}
使い方
↑上のクラスファイルを作成します。Imageクラスの使い方は↓こちらです。
<?php
include 'Image.php';
$img = (new Image('mosss.png'))->set_bgcolor_white()->resize_square(600)->save('mosss2.png');
?>
<html>
<body>
<img src="<?= $img ?>">
</body>
</html>
以上