PHPチュートリアルで画像をアップロードすると、幅と高さに制限がなく、自動的にサムネイルに切り取られます
// $Id: image.php 1937 2009-01-05 19:09:40Z デュアルフェイス $
/**
* 定义 Helper_Image 类和 Helper_ImageGD 类
*
* @link http://qeephp.com/
* @copyright Copyright (c) 2006-2009 Qeeyuan Inc. {@link http://www.qeeyuan.com}
* @license 新しい BSD ライセンス {@link http://qeephp.com/license/}
* @version $Id: image.php 1937 2009-01-05 19:09:40Z デュアルフェイス $
* @パッケージヘルパー
*/
/**
* Helper_Image クラスは画像に対する操作をカプセル化します
*
* 開発者はこのクラスのインスタンスを直接構築することはできませんが、Helper_Image::createFromFile() を使用する必要があります
※静的メソッドはImageクラスのインスタンスを作成します。
*
※大きな画像を操作する場合は、phpが十分なメモリを確保できるようにしてください。
*
* @著者 YuLei Liao
* @version $Id: image.php 1937 2009-01-05 19:09:40Z デュアルフェイス $
* @パッケージヘルパー
*/
抽象クラス Helper_Image
{
/**
* 指定されたファイルから Helper_ImageGD オブジェクトを作成します
*
* 使用法:
* @code php
* $image = Helper_Image::createFromFile('1.jpg');
* $image->resize($width, $height);
* $image->saveAsJpeg('2.jpg');
* @endcode
*
※アップロードしたファイルの場合、一時ファイル名には拡張子は含まれません。
* したがって、Image オブジェクトを作成するには次のメソッドを使用する必要があります:
*
* @code php
* $ext = pathinfo($_FILES['postfile']['name'], PATHINFO_EXTENSION);
* $image = Image::createFromFile($_FILES['postfile']['tmp_name'], $ext);
* @endcode
*
* @param string $filename 画像ファイルのフルパス
* @param string $fileext は拡張子を指定します
*
* @return Helper_ImageGD ファイルから作成された Helper_ImageGD オブジェクト
* @throw Q_NotImplementedException
*/
静的関数 createFromFile($filename, $fileext)
{
$fileext = トリム(strto lower($fileext), '.');
$ext2functions = array(
'jpg' => 'imagecreatefromjpeg',
'jpeg' => 'imagecreatefromjpeg',
'png' => 'imagecreatefrompng',
'gif' => 'imagecreatefromgif'
);
if (!isset($ext2functions[$fileext]))
{
throw new Q_NotImplementedException(__('imagecreateform' . $fileext));
}
$handle = call_user_func($ext2functions[$fileext], $filename);
return new Helper_ImageGD($handle);
}
/**
* 16 進数のカラー値を RGB 値に変換します
*
* 使用法:
* @code php
* $color = '#369';
* list($r, $g, $b) = Helper_Image::hex2rgb($color);
* echo "赤: {$r}、緑: {$g}、青: {$b}";
* @endcode
*
* @param string $color カラー値
* @param string $default 無効な色の値が使用された場合に返されるデフォルトの色
*
* @return array RGB3色から構成される配列
*/
静的関数 hex2rgb($color, $default = 'ffffff')
{
$hex = トリム($color, '#&Hh');
$len = strlen($hex);
if ($len == 3)
{
$hex = "{$hex[0]}{$hex[0]}{$hex[1]}{$hex[1]}{$hex[2]}{$hex[2]}";
}
elseif ($len < 6)
{
$hex = $default;
}
$dec = hexdec($hex);
return array(($dec >> 16) & 0xff, ($dec >> 8) & 0xff, $dec & 0xff);
}
}
/**
* Helper_ImageGD クラスは画像を操作するための gd ハンドルをカプセル化します
*
* @著者 YuLei Liao
* @version $Id: image.php 1937 2009-01-05 19:09:40Z デュアルフェイス $
* @パッケージヘルパー
*/
クラス Helper_ImageGD
{
/**
* GD リソースハンドル
*
* @var リソース
*/
protected $_handle = null;
/**
* コンストラクター
*
* @param resource $handle GD リソースハンドル
*/
関数 __construct($handle)
{
$this->_handle = $handle;
}
/**
* デストラクター
*/
関数__destruct()
{
$this->destroy();
}
/**
* 画像を指定したサイズに素早く拡大縮小します (低品質)
*
* @param int $width 新しい幅
* @param int $height 新しい高さ
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数リサイズ($width, $height)
{
if (is_null($this->_handle)) $this;
$dest = imagecreatetruecolor($width, $height);
imagecopyresize($dest, $this->_handle, 0, 0, 0, 0,
$幅、$高さ、
画像x($this->_handle)、imagesy($this->_handle));
imagedestroy($this->_handle);
$this->_handle = $dest;
$this を返します;
}
/**
* 指定されたサイズに画像を拡大縮小します (高品質ですが、resize() より遅い)
*
* @param int $width 新しい幅
* @param int $height 新しい高さ
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数リサンプリング($width, $height)
{
if (is_null($this->_handle)) $this;
を返す
$dest = imagecreatetruecolor($width, $height);
imagecopyresampled($dest, $this->_handle, 0, 0, 0, 0,
)
$幅、$高さ、
画像x($this->_handle)、imagesy($this->_handle));
imagedestroy($this->_handle);
$this->_handle = $dest;
$this を返します;
}
/**
*ズームせずに画像のサイズを変更します
*
* 使用法:
* @code php
* $image->resizeCanvas($width, $height, 'top-left');
* @endcode
*
* $pos パラメータは、画像のサイズを変更するときに画像コンテンツを配置する位置を指定します。
* * $pos パラメーターに使用できる値は次のとおりです:
*
* - left: 左揃え
* - 右: 右揃え
* - 中央: 中央揃え
* - 上: 上揃え
* - 下: 下揃え
* - 左上、左上: 左上隅を揃えます
* - 右上、右上: 右上隅を揃えます
* - 左下、左下: 左下隅を揃えます
* - 右下、右下: 右下隅を揃えます
*
* 無効な $pos パラメータが指定された場合、center を指定したことと同じになります。
*
* @param int $width 新しい高さ
* @param int $height 新しい幅
* @param string $pos 調整中の画像位置の変化
* @param string $bgcolor 空白部分のデフォルト色
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数sizeCanvas($width, $height, $pos = 'center', $bgcolor = '0xffffff')
{
if (is_null($this->_handle)) $this;
$dest = imagecreatetruecolor($width, $height);
$sx = 画像x($this->_handle);
$sy = imagesy($this->_handle);
// pos 属性に基づいて元の画像を配置する方法を決定します
スイッチ (strto lower($pos))
{
ケース「左」:
$ox = 0;
$oy = ($height - $sy) / 2;
休憩;
ケース「正しい」:
$ox = $width - $sx;
$oy = ($height - $sy) / 2;
休憩;
ケース「トップ」:
$ox = ($width - $sx) / 2;
$oy = 0;
休憩;
ケース「底部」:
$ox = ($width - $sx) / 2;
$oy = $height - $sy;
休憩;
ケース「左上」:
ケース「左上」:
$ox = $oy = 0;
休憩;
ケース「右上」:
ケース「右上」:
$ox = $width - $sx;
$oy = 0;
休憩;
ケース「左下」:
ケース「左下」:
$ox = 0;
$oy = $height - $sy;
休憩;
ケース「右下」:
ケース「右下」:
$ox = $width - $sx;
$oy = $height - $sy;
休憩;
デフォルト:
$ox = ($width - $sx) / 2;
$oy = ($height - $sy) / 2;
}
list ($r, $g, $b) = Helper_Image::hex2rgb($bgcolor, '0xffffff');
$bgcolor = imagecolorallocate($dest, $r, $g, $b);
Imagefilledrectangle($dest, 0, 0, $width, $height, $bgcolor);
Imagecolordeallocate($dest, $bgcolor);
imagecopy($dest, $this->_handle, $ox, $oy, 0, 0, $sx, $sy);
imagedestroy($this->_handle);
$this->_handle = $dest;
$this を返します;
}
/**
* 画像の縦横比を維持したまま、指定したサイズに画像をトリミングします
*
* Crop() は、画像をスケーリングするときに画像のアスペクト比を維持できるため、画像が引き伸ばされたり潰されたりすることはありません。
*
* * Crop() は、デフォルトで $width パラメーターと $height パラメーターに従って最大スケーリング率を計算します。
* 画像を最大限に埋めるためにトリミングされた画像を保持します。
*
※例として、ソース画像のサイズが800×600で、$widthと$heightが200と100に指定されているとします。
* * 次に、ソース画像が最初に 200 x 150 サイズに縮小され、次に高さの超過 50 ピクセルがトリミングされます。
*
* 使用法:
* @code php
* $image->crop($width, $height);
* @endcode
*
* 最終的に生成される画像に常に完全な画像コンテンツが含まれるようにしたい場合は、$options パラメーターを指定する必要があります。
* * このパラメータで使用可能な値は次のとおりです:
*
* - fullimage: フルイメージを保持するかどうか
* - pos: ズーム時の位置合わせ
* - bgcolor: ズーム時の余分な部分の背景色
* - 拡大: 拡大を許可するかどうか
* - 削減: 削減を許可するかどうか
*
* * その中で、$options['pos'] パラメーターの利用可能な値は次のとおりです:
*
* - left: 左揃え
* - 右: 右揃え
* - 中央: 中央揃え
* - 上: 上揃え
* - 下: 下揃え
* - 左上、左上: 左上隅を揃えます
* - 右上、右上: 右上隅を揃えます
* - 左下、左下: 左下隅を揃えます
* - 右下、右下: 右下隅を揃えます
*
* 無効な $pos パラメータが指定された場合、center を指定したことと同じになります。
*
* $options の各オプションは、トリミングを許可しながら新しい画像の右下隅に画像を配置するなど、個別に指定できます。
*
* @code php
* $image->crop($width, $height, array('pos' => 'right-bottom'));
* @endcode
*
* @param int $width 新しい幅
* @param int $height 新しい高さ
* @param array $options 切断オプション
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数 Crop($width, $height, $options = array())
{
if (is_null($this->_handle)) $this;
を返す
'フルイメージ' =>偽、
'pos' => 「センター」、
'bgcolor' => 「0xfff」、
'拡大' =>偽、
「減らす」 =>本当です、
);
$options = array_merge($default_options, $options);
// ターゲット画像を作成します
$dest = imagecreatetruecolor($width, $height);
// 背景色を塗りつぶします
list ($r, $g, $b) = Helper_Image::hex2rgb($options['bgcolor'], '0xffffff');
$bgcolor = imagecolorallocate($dest, $r, $g, $b);
imagefilledrectangle($dest, 0, 0, $width, $height, $bgcolor);
Imagecolordeallocate($dest, $bgcolor);
$full_w = imagex($this->_handle);
$full_h = imagey($this->_handle);
$ratio_w = doubleval($width) / doubleval($full_w);
$ratio_h = doubleval($height) / doubleval($full_h);
{
// 画像全体を保持したい場合は、最小の比率を選択してください
$ratio = $ratio_w < $ratio_w : $ratio_h;
}
その他
{
与えられるエステールが来ることになります
$ratio = $ratio_w > $ratio_w : $ratio_h;
}
if (!$options['enlarge'] && $ratio > 1) $ratio = 1;
$dst_h = $full_h * $ratio;
// pos プロパティに基づいて位置をどのように決定するか
スイッチ (strto lower($options['pos']))
{
ケース「左」:
$dst_x = 0;
$dst_y = ($height - $dst_h) / 2;
休憩;
ケース「正しい」:
$dst_x = $width - $dst_w;
$dst_y = ($height - $dst_h) / 2;
休憩;
ケース「トップ」:
$dst_x = ($width - $dst_w) / 2;
$dst_y = 0;
休憩;
ケース「底部」:
$dst_x = ($width - $dst_w) / 2;
$dst_y = $height - $dst_h;
休憩;
ケース「左上」:
ケース「左上」:
$dst_x = $dst_y = 0;
休憩;
ケース「右上」:
ケース「右上」:
$dst_x = $width - $dst_w;
$dst_y = 0;
休憩;
ケース「左下」:
ケース「左下」:
$dst_x = 0;
$dst_y = $height - $dst_h;
休憩;
ケース「右下」:
ケース「右下」:
$dst_x = $width - $dst_w;
$dst_y = $height - $dst_h;
休憩;
ケース「センター」:
デフォルト:
$dst_x = ($width - $dst_w) / 2;
$dst_y = ($height - $dst_h) / 2;
}
imagecopyresampled($dest, $this->_handle, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $full_w, $full_h);
imagedestroy($this->_handle);
$this->_handle = $dest;
$this を返します;
}
/**
* JPEGファイルとして保存
*
* @param string $filename 保存ファイル名
* @param int $quality 品質パラメータ、デフォルトは 80
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数 saveAsJpeg($filename, $quality = 80)
{
imagejpeg($this->_handle, $filename, $quality);
}
/**
* PNG ファイルとして保存
*
* @param string $filename 保存ファイル名
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数 saveAsPng($filename)
{
imagepng($this->_handle, $filename);
}
/**
* GIF ファイルとして保存
*
* @param string $filename 保存ファイル名
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数 saveAsGif($filename)
{
imagegif($this->_handle, $filename);
}
/**
* メモリ内の画像を破棄します
*
* @return Helper_ImageGD 一貫したインターフェイスを実装するために Helper_ImageGD オブジェクト自体を返します
*/
関数 destroy()
{
if (!$this->_handle)
{
@imagedestroy($this->_handle);
}
$this->_handle = null;
$this を返します;
}
}
调使用方法
$image = Helper_Image::createFromFile('c:a.jpg','jpg');
$image->resampled(100, 100); //100px * 100PX
に放出
$image->saveAsJpeg('c:a_output.jpg', 100);