php图片处理类、缩略、水印
class Image {
/**
* @var string $fileName ファイル名
* @access private
*/
private $fileName = '';
/**
* @var gd resource $imageResource 元の画像
* @access private
*/
private $imageResource = NULL;
/**
* @var int $imageWidth 元の画像の幅
* @access private
*/
private $imageWidth = NULL;
/**
* @var int $imageHeight 元の画像の高さ
* @access private
*/
private $imageHeight = NULL;
/**
* @var int $imageType 元の画像タイプ
* @access private
*/
private $imageType = NULL ;
/**
* @var int $newResource 新しい画像
* @access private
*/
private $newResource = NULL;
/**
* @var int $newResType 新しい画像タイプ
* @access private
*/
private $newResType = NULL;
/**
* コンストラクター
* @param string $fileName ファイル名
*/
public function __construct( $fileName = NULL) {
$this->fileName = $fileName;
if ($this->fileName) {
$this->getSrcImageInfo();
}
}
/**
* ソース画像情報を取得します
* @access private
* @return void
*/
プライベート関数 getSrcImageInfo() {
$info = $this->getImageInfo();
$this->imageWidth = $info[0];
$this->imageHeight = $info[1];
$this->imageType = $info[2];
}
/**
* 画像情報の取得
* @param string $fileName ファイル名
* @access private
* @return array
*/
private function getImageInfo($fileName = NULL) {
if ($fileName==NULL) {
$fileName = $this->fileName;
}
$info = getimagesize($fileName);
return $info;
}
/**
* ソース画像の GD リソースを作成します
* @access private
* @return void
*/
private function createSrcImage () {
$this->gt; imageResource = $this->createImageFromFile();
}
/**
* ファイルに基づいて画像 GD リソースを作成します
* @param string $fileName ファイル名
* @return gd resource
*/
public function createImageFromFile($fileName = NULL)
{
if (!$fileName) {
$fileName = $this- >fileName;
$imgType = $this->imageType;
}
if (!is_readable($fileName) || !file_exists($fileName)) {
throw new Exception('ファイル "' . $fileName . '"');
}
if (!$imgType) {
$imageInfo = $this->getImageInfo ($fileName);
$imgType = $imageInfo[2];
}
switch ($imgType) {
case IMAGETYPE_GIF:
$tempResource = imagecreatefromgif($fileName);
break;
case IMAGETYPE_JPEG:
$tempResource = imagecreatefromjpeg($fileName);
break;
case IMAGETYPE_PNG:
$tempResource = imagecreatefrompng($fileName);
break;
case IMAGETYPE_WBMP:
$tempResource = imagecreatefromwbmp($fileName);
break;
ケース IMAGETYPE_XBM:
$tempResource = imagecreatefromxbm($fileName);
break;
default:
throw new Exception('错误的图片格式,または图片有问
题!');
}
return $tempResource;
}
/**
*変更画像大小
* @param int $width 宽
* @param int $height 高
* @param string $flag 按什么方式変更变 0=长宽转换成パラメータ指定的 1=按比
例缩放,长宽约束在パラメータ指定内,2=以宽として约束缩放,3=以高约束缩放
* @return string
*/
public function assignImage($width, $height, $flag=1) ) {
global $cfg;
$widthRatio = $width/$this->imageWidth;
$heightRatio = $height/$this->imageHeight;
switch ($flag) {
case 1:
if ($ this->imageHeight < $this-
>imageWidth < $width) {
$endWidth = $this->imageWidth;
$endHeight = $this->imageHeight;
//return ;
} elseif (($this->imageHeight * $widthRatio)
>$height) {
$endWidth = ceil($this->imageWidth *
$heightRatio);
$endHeight = $height;
} else {
$endWidth = $width;
$endHeight = ceil($this->gt;imageHeight *
$widthRatio);
}
break;
ケース 2:
$endWidth = $width;
$endHeight = ceil($this->imageHeight * $widthRatio);
break;
ケース 3:
$endWidth = ceil($this->imageWidth * $heightRatio);
$endHeight = $height;
break;
ケース 4 :
$endWidth2 = $width;
$endHeight2 = $height;
if ($this->imageHeight < $height && $this-
>imageWidth < $width) {
$endWidth = $this->imageWidth;
$endHeight = $this->imageHeight;
//return;
} elseif (($this->imageHeight * $widthRatio)
< $height) {
$endWidth = ceil($this->imageWidth *
$heightRatio);
$endHeight = $height;
} else {
$endWidth = $width;
$endHeight = ceil($this- >imageHeight *
$widthRatio);
}
break;
case 5:
$endWidth2 = $width;
$endHeight2 = $height;
if ($this->imageHeight > $height && $this-
>imageWidth > $width) {
//都大
$ratio = max($this->imageHeight/
$height,$this->imageWidth/$width);
}elseif ($ this->imageHeight > $height){
$ratio = $this->imageHeight/$height;
}elseif ( $this->imageWidth > $width){
$ratio =$this-> imageWidth/$width;
}else{
$ratio =1;
}
$endWidth = $this->gt;imageWidth / $ratio;
$endHeight = $this->gt;imageHeight / $ratio;
break;
デフォルト:
$endWidth = $width;
$endHeight = $height;
break;
}
if ($this->imageResource==NULL) {
$this->createSrcImage();
}
if ($flag == 5){
// 直接缩略
$this->newResource = imagecreatefromjpeg($cfg
['path']['data'].'blank_thumb.jpg');
}elseif ( $flag==4) {
$this->newResource = imagecreatetruecolor
($endWidth2,$endHeight2);
} else {
$this->newResource = imagecreatetruecolor
($endWidth,$endHeight);
}
$this->newResType = $this->imageType;
if($flag == 5){
$dest_x = ($width-$endWidth)/2;
$dest_y = ($height-$endHeight) )/2;
imagecopyresampled($this->newResource, $this-
}else{
imagecopyresampled($this->newResource, $this-
}
}
/**
* 画像にウォーターマークを追加します
* @param string $waterContent ウォーターマークの内容は画像ファイル名にすることも、テキスト
* @param int $pos 位置 0 ~ 9 は配列にすることができます
* @param int $textFont フォント 大きい文字、ウォーターマークの内容がテキストの場合に有効
* @param string $textColor テキストの色、ウォーターマークの内容がテキストの場合に有効
* @return string
*/
public function WaterMark($waterContent, $pos = 0, $textFont=5,
$isWaterImage = file_exists($waterContent);
if ($isWaterImage) {
$waterImgRes = $this->createImageFromFile
$waterImgInfo = $this->getImageInfo($waterContent);
$waterWidth = $waterImgInfo[0];
$waterHeight = $waterImgInfo[1];
} else {
$waterText = $waterContent;
//$temp = @imagettfbbox(ceil
if ($temp) {
$waterWidth = $temp[2]-$temp[6];
$waterHeight = $temp[3]-$temp[7];
} else {
$waterWidth = 100;
$waterHeight = 12;
}
}
if ($this->gt;imageResource==NULL) {
$this->createSrcImage();
}
switch($pos)
{
case 0://随机
$posX = rand(0,($this->imageWidth - $waterWidth));
$posY = rand(0,($this->imageHeight - $waterHeight));
休憩;
case 1://1は顶端居左
$posX = 0;
$posY = 0;
休憩;
case 2://2は顶端居中
$posX = ($this->imageWidth - $waterWidth) / 2;
$posY = 0;
休憩;
ケース 3://3 は顶端居右
$posX = $this->imageWidth - $waterWidth;
$posY = 0;
休憩;
case 4://4は中部居左
$posX = 0;
$posY = ($this->imageHeight - $waterHeight) / 2;
休憩;
case 5://5は中部居中
$posX = ($this->imageWidth - $waterWidth) / 2;
$posY = ($this->imageHeight - $waterHeight) / 2;
休憩;
case 6://6は中部居右
$posX = $this->imageWidth - $waterWidth;
$posY = ($this->imageHeight - $waterHeight) / 2;
休憩;
case 7://7は底端居左
$posX = 0;
$posY = $this->imageHeight - $waterHeight;
休憩;
case 8://8 は底端居中
$posX = ($this->imageWidth - $waterWidth) / 2;
$posY = $this->imageHeight - $waterHeight;
休憩;
case 9://9 は底端居右
$posX = $this->imageWidth - $waterWidth-20;
$posY = $this->imageHeight - $waterHeight-10;
休憩;
default://随机
$posX = rand(0,($this->imageWidth - $waterWidth));
$posY = rand(0,($this->imageHeight - $waterHeight));
休憩;
}
imagealphablending($this->imageResource, true);
if($isWaterImage) {
imagecopy($this->imageResource, $waterImgRes, $posX,
} else {
$R = hexdec(substr($textColor,1,2));
$G = hexdec(substr($textColor,3,2));
$B = hexdec(substr($textColor,5));
$textColor = imagecolorallocate($this-
imagestring ($this->imageResource, $textFont, $posX,
)
$posY、$waterText、$textColor);
}
$this->newResource = $this->imageResource;
$this->newResType = $this->imageType;
}
/**
* 認証コード画像を生成します
* @param int $width width
* @param string $height height
* @param int $length length
* @param int $validType 0=数字、1=文字、2=数字と文字
* @param string $textColor テキストの色
* @param string $backgroundColor 背景色
* @return void
*/
public function imageValidate($ width, $height, $length = 4,
$validType = 1, $textColor = '#000000', $backgroundColor = '#ffffff') {
if ($validType==1) {
//$validString =
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
//$validLength = 52;
//いいえ、いいえ
$validString =
'abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNOPQRSTUV WXYZ';
$validLength = 48;
} elseif ($validType==2) {
/ /$validString =
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
//$validLength = 62;
//いいえ、いいえ、いいえ 1
$validString =
'0234567 89abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNOPQRSTUVWXYZ';
$validLength = 57;
} else {
$validString = '0123456789';
$validLength = 10;
}
srand((int)time());
$valid = '';
for ($i=0; $i<$length; $i++) {
$valid .= $validString{rand(0, $validLength-1)};
}
$this->newResource = imagecreate($width,$height);
$bgR = hexdec(substr($backgroundColor,1) ,2));
$bgG = hexdec(substr($backgroundColor,3,2));
$bgB = hexdec(substr($backgroundColor,5,2));
$backgroundColor = imagecolorallocate($this-> newResource,
$bgR, $bgG, $bgB);
$tR = hexdec(substr($textColor,1,2));
$tG = hexdec(substr($textColor,3,2));
$ tB = hexdec(substr($textColor,5,2));
$textColor = imagecolorallocate($this->newResource, $tR,
$tG, $tB);
for ($i=0;$i<) ;strlen($valid);$i++){
imagestring($this->newResource,5,$i*$width/
$length+3,2, $valid[$i],$textColor);
}
$this->newResType = IMAGETYPE_JPEG;
return $valid;
}
/**
* 出力イメージを表示します
* @return void
*/
public function display($fileName='', $quality=60) {
$ imgType = $this->newResType;
$imageSrc = $this->newResource;
switch ($imgType) {
case IMAGETYPE_GIF:
if ($fileName=='') {
header('Content-type: image/gif');
}
imagegif($imageSrc, $fileName, $quality);
break;
case IMAGETYPE_JPEG:
if ($fileName=='') {
header('Content-type: image/jpeg ');
}
imagejpeg($imageSrc, $fileName, $quality);
break;
case IMAGETYPE_PNG:
if ($fileName=='') {
header('Content-type: image/png');
imagepng($imageSrc);
} else {
imagepng($imageSrc, $fileName);
}
break;
case IMAGETYPE_WBMP:
if ($fileName=='') {
header('Content-type: image /wbmp');
}
imagewbmp($imageSrc, $fileName, $quality);
break;
case IMAGETYPE_XBM:
if ($fileName=='') {
header('Content-type: image/xbm' );
}
imagexbm($imageSrc, $fileName, $quality);
break;
default:
throw new Exception('Unsupport image type');
}
imagedestroy($imageSrc);
}
/ * *
* 保存画像
* @param int $fileNameType 文件名类型 0使用原文件名,1使用指定文
ファイル名、2は元のファイル名にサフィックスを追加、3はランダムなファイル名を生成
* @param string $folder フォルダーパスが空の場合は元のファイルと同じになります
* @param string $param の場合パラメータ $fileNameType が 2 の場合、ファイル名 Suffix が追加されます
* @return void
*/
public function save($fileNameType = 0, $folder = NULL, $param =
'_miniature') {
if ($ directory==NULL) {
$folder = dirname( $this-
>fileName).DIRECTORY_SEPARATOR;
}
$fileExtName = FileSystem::fileExt($this->fileName, true);
$fileBesicName = FileSystem::getBasicName($this->fileName,
false);
switch ($fileNameType) {
case 1:
//$newFileName = $folder.$param;
$newFileName = $folder.basename($ this-
>fileName);
// var_dump($newFileName);
ブレーク;
ケース 2:
$newFileName =
$folder.$fileBesicName.$param.$fileExtName;
ブレーク;
ケース 3:
$tmp = date('YmdHis');
$fileBesicName = $tmp;
$i = 0;
while (file_exists
($folder.$fileBesicName.$fileExtName)) {
$fileBesicName = $tmp.$ i;
$i++;
}
$newFileName =
$folder.$fileBesicName.$fileExtName;
ブレーク;
デフォルト:
$newFileName = $this->fileName;
ブレーク;
}
$this- >display($newFileName);
return $newFileName ; }
/**
* 選択範囲を切り出す
*
* @param string $srcimgurl 元画像
* @param string $endimgurl 加工画像
* @param int $x 座標原点X
* @param int $y 座標原点Y
* @ param int $endimg_w 最終画像の幅
* @param int $endimg_h 最終画像の高さ
* @param int $border_w 最終座標 X
* @param int $border_h 最終座標 Y
* @param int $scale 元の画像のスケーリング状況パーセンテージ
* @param int $値を自動的に取得するかどうかを修正します
*/
public function Cutimg
$path = dirname ($endimgurl);
if (!is_dir($path)) {
if(!@mkdir ($path, 0777) )){
die ("{$path} このディレクトリを作成できません。ファイルの作成に失敗しました");
}
}
$ground_info = getimagesize($srcimgurl);
switch($ground_info[2]){
case 1 :$im = imagecreatefromgif($srcimgurl);break;
case 2:$im = imagecreatefromjpeg($srcimgurl);break;
case 3:$im = imagecreatefrompng($srcimgurl);break; $srcimgurl"); は許可されません
}
if($fix ){//アバターの一部を便利にキャプチャします
if($ground_info[0]<$ground_info[1]){
$border_w=$ground_info[0 ];
$border_h=$endimg_h*$ground_info[0]/
$endimg_w;
$border_h=$ground_info[1];
$ border_w=$endimg_w*$ground_info[1]/
$endimg_h;
$border_w=$ground_info[0];
$border_h=$ground_info[1];
}
}
$newim = imagecreatetruecolor( $endimg_w, $endimg_h);
$x=($x*100 )/$scale;
$y=($y*100)/$scale;
$border_width=($border_w*100)/$scale;
$border_height=($border_h*100)/$scale;
imagecopyresampled( $newim, $im, 0,0, $x,$y, $endimg_w,
$endimg_h, $border_width, $border_height );
if(function_exists("imagegif")){
switch($ground_info[2]){
ケース 1:imagegif($newim,$endimgurl);break;
ケース 2 :imagejpeg($newim,$endimgurl);break;
ケース 3:imagepng($newim,$endimgurl);break;
default:die("errorMsg");
}
}elseif(function_exists("imagejpeg")){
imagejpeg($newim,$endimgurl);
}else{
imagepng($newim,$endimgurl);
}
imagedestroy ($newim);
imagedestroy ( $im);
}
}