再サンプリングを行いイメージの一部をコピー、伸縮する

# imagecopyresampled

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecopyresampled — 再サンプリングを行いイメージの一部をコピー、伸縮する

### 説明

function imagecopyresampled(
GdImage `$dst_image`,
GdImage `$src_image`,
int `$dst_x`,
int `$dst_y`,
int `$src_x`,
int `$src_y`,
int `$dst_width`,
int `$dst_height`,
int `$src_width`,
int `$src_height`
): true

imagecopyresampled() は、イメージの矩形の部分 を別のイメージにコピーします。同時にピクセル値を滑らかに補間を行い、 このため、特にサイズを小さくした場合には鮮明さが維持されます。

言い換えると、imagecopyresampled() は `src_image` の座標 (`src_x`,`src_y`) にある 幅 `src_width`、高さ `src_height` の矩形領域を受け取って、それを `dst_image` の座標 (`dst_x`,`dst_y`) にある幅 `dst_width`、 高さ `dst_height` の矩形領域に配置します。

コピー元とコピー先の座標、幅、高さが異なる場合には、 適当なイメージ伸縮が行われます。座標は、左上を基準とします。 この関数は、同じイメージ内の領域にコピーする場合にも使用可能です (`dst_image` が `src_image` と同じ場合) が、領域が重なる場合の結果は予測できません。

### パラメータ

`dst_image`

  コピー先の画像リソース。

`src_image`

  コピー元の画像リソース。

`dst_x`

  コピー先の x 座標。

`dst_y`

  コピー先の y 座標。

`src_x`

  コピー元の x 座標。

`src_y`

  コピー元の y 座標。

`dst_width`

  コピー先の幅。

`dst_height`

  コピー先の高さ。

`src_width`

  コピー元の幅。

`src_height`

  コピー元の高さ。

### 戻り値

常に `true` を返します。

### 変更履歴

バージョン | 説明
--- | ---
8.5.0 | 戻り値の型が、`true` になりました。これより前のバージョンでは、bool でした。
8.0.0 | `dst_image` と `src_image` は、 GdImage クラスのインスタンスを期待するようになりました。 これより前のバージョンでは、 resource を期待していました。

### 例

例1 単純な例

この例は、イメージをオリジナルの半分のサイズに再サンプルします。

    <?php
    // ファイル
    $filename = 'test.jpg';
    $percent = 0.5;

    // コンテントタイプ
    header('Content-Type: image/jpeg');

    // 新規サイズを取得します
    list($width, $height) = getimagesize($filename);
    $new_width = $width * $percent;
    $new_height = $height * $percent;

    // 再サンプル
    $image_p = imagecreatetruecolor($new_width, $new_height);
    $image = imagecreatefromjpeg($filename);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

    // 出力
    imagejpeg($image_p, null, 100);
    ?>

上の例の出力は、 たとえば以下のようになります。

例2 イメージを均等に再サンプルする

この例は最大の幅もしくは高さが 200 ピクセルのイメージを表示します。

    <?php
    // ファイル
    $filename = 'test.jpg';

    // 最大の高さ・幅を設定します
    $width = 200;
    $height = 200;

    // コンテントタイプ
    header('Content-Type: image/jpeg');

    // 新規サイズを取得します
    list($width_orig, $height_orig) = getimagesize($filename);

    $ratio_orig = $width_orig/$height_orig;

    if ($width/$height > $ratio_orig) {
       $width = $height*$ratio_orig;
    } else {
       $height = $width/$ratio_orig;
    }

    // 再サンプル
    $image_p = imagecreatetruecolor($width, $height);
    $image = imagecreatefromjpeg($filename);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

    // 出力
    imagejpeg($image_p, null, 100);
    ?>

上の例の出力は、 たとえば以下のようになります。

### 注意

> 注意:

> パレットイメージの制限(255+1色)による問題があります。 カラーの再サンプリングやフィルタリングには通常は255色以上の色が 必要となります。再サンプルするピクセルとその色を計算するために ある種の近似計算が使用されます。パレットに新しい色を割り当てよう として失敗すると、(理論的に)最も近い色が選択されます。 それは必ずしも常に可視色とは限りません。そのため、 空白(あるいは不可視な)といった不可思議な結果がもたらされます。 この問題を回避するには、imagecreatetruecolor()で 生成されるようなTrueカラーイメージを目的のイメージとして 使用してください。

### 参考

- imagecopyresized() - 画像の一部をコピーしサイズを変更する
- imagescale() - 幅と高さを指定して、画像の縮尺を変更する
- imagecrop() - 指定した矩形に画像をクロップする

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open