画像操作クラス

CodeIgniterの画像操作クラスを使用すると、以下の操作を実行できます。

  • 画像のサイズ変更

  • サムネイルの作成

  • 画像のトリミング

  • 画像の回転

  • 画像へのウォーターマークの追加

以下の画像ライブラリがサポートされています:GD/GD2、ImageMagick。

クラスの初期化

CodeIgniterの他のほとんどのクラスと同様に、画像クラスは、コントローラーでServicesクラスを呼び出すことで初期化されます。

<?php

$image = \Config\Services::image();

使用したい画像ライブラリのエイリアスをService関数に渡すことができます。

<?php

$image = \Config\Services::image('imagick');

利用可能なハンドラーは以下のとおりです。

  • gd GD/GD2画像ライブラリ

  • imagick ImageMagickライブラリ。

ImageMagickライブラリを使用する場合は、サーバー上のライブラリへのパスを**app/Config/Images.php**で設定する必要があります。

注記

ImageMagickハンドラーには、imagick拡張機能が必要です。

画像の処理

実行したい処理の種類(サイズ変更、トリミング、回転、またはウォーターマーク)に関係なく、一般的なプロセスは同じです。実行する操作に対応するいくつかの設定を行い、利用可能な処理関数のいずれかを呼び出します。たとえば、画像サムネイルを作成するには、次のようにします。

<?php

$image->withFile('/path/to/image/mypic.jpg')
    ->fit(100, 100, 'center')
    ->save('/path/to/image/mypic_thumb.jpg');

上記のコードは、ライブラリに`source_image`フォルダにある`mypic.jpg`という画像を探させ、それからGD2画像ライブラリを使用して100x100ピクセルの新しい画像を作成し、それを新しいファイル(サムネイル)に保存するように指示します。`fit()`メソッドを使用しているため、目的のアスペクト比に基づいて画像の最適な部分をトリミングし、その結果をトリミングしてサイズ変更しようとします。

画像は、保存する前に、必要に応じて利用可能なメソッドをいくつでも処理できます。元の画像はそのまま残され、新しい画像が使用され、各メソッドに渡され、結果が前の結果の上に適用されます。

<?php

$image->withFile('/path/to/image/mypic.jpg')
    ->reorient()
    ->rotate(90)
    ->crop(100, 100, 0, 0)
    ->save('/path/to/image/mypic_thumb.jpg');

この例では、同じ画像を最初に携帯電話の向きに関する問題を修正し、画像を90度回転してから、結果を左上から始まる100x100ピクセルの画像にトリミングします。結果はサムネイルとして保存されます。

注記

画像クラスが処理を実行できるようにするには、画像ファイルを含むフォルダに書き込み権限が必要です。

注記

画像処理では、一部の操作にかなりのサーバーメモリが必要になる場合があります。画像処理中にメモリ不足エラーが発生する場合は、最大サイズを制限したり、PHPのメモリ制限を調整する必要がある場合があります。

画像の品質

save()は、結果の画像品質を変更するための追加パラメーター$qualityを取ることができます。値の範囲は0〜100で、90がフレームワークのデフォルトです。このパラメーターはJPEGおよびWEBP画像にのみ適用され、それ以外の場合は無視されます。

注記

v4.4.0以降、WebPの$qualityパラメーターを使用できます。

<?php

$image->withFile('/path/to/image/mypic.jpg')
    // processing methods
    ->save('/path/to/image/my_low_quality_pic.jpg', 10);

注記

品質が高いほど、ファイルサイズが大きくなります。https://www.php.net/manual/en/function.imagejpeg.phpも参照してください。

処理を行わずに画像の品質のみを変更することに関心がある場合。画像リソースを含める必要があります。そうでない場合、正確なコピーが作成されます。

<?php

$image->withFile('/path/to/image/mypic.jpg')
    ->withResource()
    ->save('/path/to/image/my_low_quality_pic.jpg', 10);

処理メソッド

7つの処理メソッドがあります。

  • $image->crop()

  • $image->convert()

  • $image->fit()

  • $image->flatten()

  • $image->flip()

  • $image->resize()

  • $image->rotate()

  • $image->text()

これらのメソッドはクラスインスタンスを返すため、上記のようにチェーンできます。失敗した場合は、エラーメッセージを含むCodeIgniter\Images\ImageExceptionをスローします。例外をキャッチして、失敗時にエラーを表示するのが良い方法です。例:

<?php

$image = \Config\Services::image();

try {
    $image->withFile('/path/to/image/mypic.jpg')
        ->fit(100, 100, 'center')
        ->save('/path/to/image/mypic_thumb.jpg');
} catch (\CodeIgniter\Images\Exceptions\ImageException $e) {
    echo $e->getMessage();
}

画像のトリミング

画像をトリミングして、元の画像の一部のみを残すことができます。これは、特定のサイズ/アスペクト比に一致する必要があるサムネイル画像を作成する場合によく使用されます。これはcrop()メソッドで処理されます。

crop(int $width = null, int $height = null, int $x = null, int $y = null, bool $maintainRatio = false, string $masterDim = 'auto')
  • $widthは、結果の画像の目的の幅(ピクセル単位)です。

  • $heightは、結果の画像の目的の高さと(ピクセル単位)です。

  • $xは、画像の左側からトリミングを開始するピクセル数です。

  • $yは、画像の上部からトリミングを開始するピクセル数です。

  • $maintainRatioは、trueの場合、画像の元の縦横比を維持するために必要に応じて最終的な寸法を調整します。

  • $masterDimは、$maintainRatioがtrueの場合に、どの寸法をそのままにするかを指定します。値は'width''height'、または'auto'です。

画像の中央から50x50ピクセルの正方形を取り出すには、最初に適切なxとyのオフセット値を計算する必要があります。

<?php

$info = \Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->getFile()
    ->getProperties(true);

$xOffset = ($info['width'] / 2) - 25;
$yOffset = ($info['height'] / 2) - 25;

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->crop(50, 50, $xOffset, $yOffset)
    ->save('/path/to/new/image.jpg');

画像の変換

convert()メソッドは、目的のファイル形式に対するライブラリの内部インジケーターを変更します。これは実際の画像リソースには影響しませんが、save()にどの形式を使用するかを示します。

convert(int $imageType)

注記

ImageMagickは、拡張子によって示される型でファイルを保存し、$imageTypeを無視します。

画像のフィット

fit()メソッドは、次の手順を実行することで、画像の一部を「スマート」にトリミングすることを簡素化することを目的としています。

  • 目的のアスペクト比を維持するために、元の画像の正しい部分をトリミングする方法を決定します。

  • 元の画像をトリミングします。

  • 最終的な寸法にサイズ変更します。

fit(int $width, int $height = null, string $position = 'center')
  • $widthは、画像の目的の最終的な幅です。

  • $heightは、画像の目的の最終的な高さです。

  • $position は、画像の切り抜き範囲を決定します。許容される位置は、'top-left''top''top-right''left''center''right''bottom-left''bottom''bottom-right'です。

これにより、アスペクト比を常に維持する、はるかに簡単な切り抜き方法が提供されます。

<?php

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->fit(100, 150, 'left')
    ->save('/path/to/new/image.jpg');

画像のフラット化

flatten() メソッドは、透過画像(PNG)の背景色を追加し、RGBAピクセルをRGBピクセルに変換することを目的としています。

  • 透過画像からJPGに変換する際に、背景色を指定します。

flatten(int $red = 255, int $green = 255, int $blue = 255)
  • $red は背景の赤の値です。

  • $green は背景の緑の値です。

  • $blue は背景の青の値です。

<?php

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.png')
    ->flatten()
    ->save('/path/to/new/image.jpg');

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.png')
    ->flatten(25, 25, 112)
    ->save('/path/to/new/image.jpg');

画像の反転

画像は、水平軸または垂直軸のいずれかに沿って反転できます。

flip(string $dir)
  • $dir は反転する軸を指定します。'vertical' または 'horizontal' のいずれかです。

<?php

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->flip('horizontal')
    ->save('/path/to/new/image.jpg');

画像のサイズ変更

resize() メソッドを使用して、必要な寸法に合わせて画像のサイズを変更できます。

resize(int $width, int $height, bool $maintainRatio = false, string $masterDim = 'auto')
  • $width は、新しい画像の幅(ピクセル単位)です。

  • $height は、新しい画像の高さ(ピクセル単位)です。

  • $maintainRatio は、画像を新しい寸法に合わせてストレッチするかどうか、または元の縦横比を維持するかどうかを決定します。

  • $masterDim は、縦横比を維持する際に、どの軸の寸法を優先するかを指定します。'width''height'のいずれかです。

画像のサイズ変更時には、元の画像の縦横比を維持するか、新しい画像を目的の寸法に合わせてストレッチ/圧縮するかを選択できます。$maintainRatio が true の場合、$masterDim で指定された寸法は同じになり、もう一方の寸法は元の画像のアスペクト比に合わせて変更されます。

<?php

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->resize(200, 100, true, 'height')
    ->save('/path/to/new/image.jpg');

画像の回転

rotate() メソッドを使用すると、画像を90度単位で回転できます。

rotate(float $angle)
  • $angle は回転角度(度)です。90180270 のいずれかです。

注記

$angle パラメータは浮動小数点数を受け付けますが、処理中に整数に変換されます。上記3つの値以外の値の場合、CodeIgniterImagesImageException がスローされます。

テキストウォーターマークの追加

text() メソッドを使用すると、画像にテキストウォーターマークを簡単に重ねることができます。これは、著作権表示、写真家の名前、または単に画像をプレビューとしてマークして、他人の最終製品で使用されないようにする場合に役立ちます。

text(string $text, array $options = [])

最初の引数は表示するテキスト文字列です。2番目の引数は、テキストの表示方法を指定できるオプションの配列です。

<?php

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->text('Copyright 2017 My Photo Co', [
        'color'      => '#fff',
        'opacity'    => 0.5,
        'withShadow' => true,
        'hAlign'     => 'center',
        'vAlign'     => 'bottom',
        'fontSize'   => 20,
    ])
    ->save('/path/to/new/image.jpg');

認識されるオプションは次のとおりです。

  • color テキストの色(16進数)、例:#ff0000

  • opacity テキストの不透明度を表す 0~1 の数値。

  • withShadow 影を表示するかどうかを表すブール値。

  • shadowColor 影の色(16進数)

  • shadowOffset 影をオフセットするピクセル数。垂直方向と水平方向の両方の値に適用されます。

  • hAlign 水平方向の配置:left、center、right

  • vAlign 垂直方向の配置:top、middle、bottom

  • hOffset x軸の追加オフセット(ピクセル単位)

  • vOffset y軸の追加オフセット(ピクセル単位)

  • fontPath 使用するTTFフォントのサーバー上のフルパス。指定がない場合はシステムフォントが使用されます。

  • fontSize 使用するフォントサイズ。システムフォントを使用するGDハンドラの場合、有効な値は1~5です。

注記

ImageMagickドライバは、fontPathのサーバー上のフルパスを認識しません。代わりに、使用したいインストール済みのシステムフォントの名前(例:Calibri)を指定してください。