<?php
/*
给图片加水印
1.添加文字水印
(1) 要把字体文件复制到放图片的这个文件夹里,例如这里用simhei.ttf字体
2.添加图片水印
*/
$filename = '1.jpeg';
//水印文字
$text = '这是一个水印';
////////////////////////
//先拿到图片
///////////////////////
// imagecreatefromstring(); 返回一个图像标识符,其表达了从给定字符串得来的图像。图像格式将自动检测,只要 PHP 支持:JPEG,PNG,GIF,WBMP 和 GD2。就是自动检测图像类型(后缀)
// file_get_contents() 把整个文件读入一个字符串中。就是把一个文件打开,变成字符串
$image = imagecreatefromstring(file_get_contents($filename));
//水印颜色
$color = imagecolorallocate($image, 255, 0, 0);
//水印开始坐标
$x = 0;
$y = 30;
////////////////////////
//然后写字
///////////////////////
imagettftext($image, 30, $x, $y, $color, 'simhei.ttf', $text);
////////////////////////
//最后生成图片
///////////////////////
//拿到图片后缀
//strtolower();将后缀全部转为小写,拿到的后缀有可能是大写的,先全部转成大写或小写都可以
$suffix = strtolower(strrchr($filename, '.'));
switch($suffix){
case '.jpg':
case '.jpeg':
//把这两种格式统一写成一种,本身这两个后缀都是同一个格式
//所以case后面的内容都是一样的,所以第一个case后面不用写
$func = 'imagejpeg';break;
case '.gif';
$func = 'imagegif';break;
case '.png';
$func = 'imagepng';break;
}
//拿到文件目录,就是存放原图的路径,然后给新图重新命名并添加路径
//dirname: 取一个文件的目录部分
//basename :取一个文件的文件部分,可以是去掉目录,也可以是去掉后缀
//因为原图和修改后的图在同一个文件夹,所以给每一个修改后的图加上一个w_
$path = dirname($filename);
$water = $path.'/w_'.basename($filename);
// 生成目标图片并保存
//imagejpeg($dst_image, 'thumb2.jpg');如果没有上面的switch,就要这样写
//判定后,用另一种写法
//用$thumb将图片名也换掉,并加上路径
$func($image, $water);
//销毁资源:
imagedestroy($image);
?>
<?php
//图片缩略:先创建一个小的画布尺寸,然后把要缩的图片按坐标放到这个画布上,最后再把这个画布存起来,就完成缩略图了
//用GD库中的 imagecopyresampled(); 函数
// 这有一个问题,如果画布尺寸和原图尺寸比例不一样,缩小后就会变形(拉伸)
$filename = 'public/uploads/images/20191020/1.jpg';
//getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_WARNING级的错误信息。
//把获取到的数组中的值赋给list函数中的变量
list($src_w, $src_h) = getimmagesize($filename);
$per = 0.5;//设置缩放比例:缩小一半
//目标尺寸:如果不在前面设置缩放比例,也可以在这里直接写固定尺寸
//$dst_w = 200; $dst_h = 300; 但是这样写会变形,要想他不变形,就要算好原图的比例,这里用等比例缩放的方式,计算原图宽高比例然后缩放的方式在2.php
$dst_w = $src_w*$per;
$dst_h = $src_h*$per;
// imagecreatefromstring(); 返回一个图像标识符,其表达了从给定字符串得来的图像。图像格式将自动检测,只要 PHP 支持:JPEG,PNG,GIF,WBMP 和 GD2。就是自动检测图像类型(后缀)
//file_get_contents() 把整个文件读入一个字符串中。就是把一个文件打开,变成字符串
$src_image = imagecreatefromstring(file_get_contents($filename));
//imagecreatetruecolor — 新建一个真彩色图像,返回一个图像标识符,代表一幅幅大小为 x_size 和 y_size 的黑色图像。
$dst_image = imagecreatetruecolor($dst_w, $dst_h);
//从目标的0,0点坐标开始平铺
$dst_x = 0;
$dst_y = 0;
/*
imagecopyresampled — 重采样拷贝部分图像并调整大小
imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
dst_image
目标图象连接资源。
src_image
源图象连接资源。
dst_x
目标(画布的坐标) X 坐标点。
dst_y
目标(画布的坐标) Y 坐标点。
src_x
源(从原图片的那个位置开始截)的 X 坐标点。
src_y
源(从原图片的那个位置开始截)的 Y 坐标点。
dst_w
目标宽度。
dst_h
目标高度。
src_w
源图象的宽度。
src_h
源图象的高度。
*/
imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
// 生成目标图片并保存
imagejpeg($dst_image, 'thumb.jpg');
//销毁资源:两个资源,原图像和生成的图像
imagedestroy($src_image);
imagedestroy($dst_image);
?>
<?php
/*
给图片加水印
1.添加文字水印
2.添加图片水印
*/
$filename = '1.jpeg';
//水印图片
$water_filename = 'water.jpg';
//这是透明度(用于水印的透明度)
//透明度有些图可能改不了,这跟用的图有关
//$pct = 80;
//$position = 1;
//接收函数返回值
$ret = water_img($filename, $water_filename, 5, 80);
//然后将它输出给图片,加了水印的图片就会在浏览器中显示
echo "<img src='$ret'/>";
//封装函数: 4个参数
function water_img($filename, $water_filename, $position=9, $pct=100){
////////////////////////
//先拿到图片
///////////////////////
// imagecreatefromstring(); 返回一个图像标识符,其表达了从给定字符串得来的图像。图像格式将自动检测,只要 PHP 支持:JPEG,PNG,GIF,WBMP 和 GD2。就是自动检测图像类型(后缀)
// file_get_contents() 把整个文件读入一个字符串中。就是把一个文件打开,变成字符串
//把目标图和原图打开
$dst_im = imagecreatefromstring(file_get_contents($filename));
$src_im = imagecreatefromstring(file_get_contents($water_filename));
//打开一个资源,获取宽度、高度
$src_w = imagesx($src_im);
$src_h = imagesx($src_im);
//如果先把原图分成9块,再确决定把水印加在哪一个部分
//先拿到目标图的大小
//然后根据原图和水印图的尺寸确定位置
//最后,如果没有给1-9中的任意一个位置的话,给一个默认值default:从0,0位置开始
//getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_WARNING级的错误信息。
//把获取到的数组中的值赋给list函数中的变量
list($dst_w, $dst_h) = getimmagesize($filename);
switch($position){
case 1://左上角
//水印图在目标图上的位置
$dst_x = 0;
$dst_y = 0;
break;
case 2://上居中
//水印图在目标图上的位置
$dst_x = ($dst_w-$src_w)/2;
$dst_y = 0;
break;
case 3://右上角
//水印图在目标图上的位置
$dst_x = $dst_w-$src_w;
$dst_y = 0;
break;
case 4://左居中
//水印图在目标图上的位置
$dst_x = 0;
$dst_y = ($dst_h-$src_h)/2;
break;
case 5://居中
//水印图在目标图上的位置
$dst_x = ($dst_w-$src_w)/2;
$dst_y = ($dst_h-$src_h)/2;
break;
case 6://右居中
//水印图在目标图上的位置
$dst_x = $dst_w-$src_w;
$dst_y = ($dst_h-$src_h)/2;
break;
case 7://左下角
//水印图在目标图上的位置
$dst_x = 0;
$dst_y = $dst_h-$src_h;
break;
case 8://下居中
//水印图在目标图上的位置
$dst_x = ($dst_w-$src_w)/2;
$dst_y = $dst_h-$src_h;
break;
case 9://右下角
//水印图在目标图上的位置
$dst_x = $dst_w-$src_w;
$dst_y = $dst_h-$src_h;
break;
default:
$dst_x = 0;
$dst_y = 0;
}
//把水印图叠加到原图上,这里0,0是从哪个位置开始截取图像做水印图,一般从00开始
//后面的$src_w, $src_h
imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct);
////////////////////////
//最后生成图片
///////////////////////
//拿到图片后缀
//strtolower();将后缀全部转为小写,拿到的后缀有可能是大写的,先全部转成大写或小写都可以
$suffix = strtolower(strrchr($filename, '.'));
switch($suffix){
case '.jpg':
case '.jpeg':
$func = 'imagejpeg';break;//把这两种格式统一写成一种,本身这两个后缀都是同一个格式,所以case后面的内容都是一样的,所以第一个case后面不用写
case '.gif';
$func = 'imagegif';break;
case '.png';
$func = 'imagepng';break;
}
//拿到文件目录,就是存放原图的路径,然后给新图重新命名并添加路径
//dirname: 取一个文件的目录部分
//basename :取一个文件的文件部分,可以是去掉目录,也可以是去掉后缀
//因为原图和修改后的图在同一个文件夹,所以给每一个修改后的图加上一个w_
$path = dirname($filename);
$water = $path.'/w_'.basename($filename);
// 生成目标图片并保存
//imagejpeg($dst_image, 'thumb2.jpg');如果没有上面的switch,就要这样写
//判定后,用另一种写法
//用$thumb将图片名也换掉,并加上路径
$func($dst_im, $water);
//销毁资源:
imagedestroy($dst_im);
imagedestroy($src_im);
}
return $water;
?>
<?php
// $filename = '1.jpeg';
// $text = '这是一个文字水印';
// $image = imagecreatefromstring(file_get_contents($filename));
// $color = imagecolorallocate($image, 255, 0, 0);
// $x = 0;
// $y = 30;
// imagettftext($image, 30, $x, $y, $color, 'simhei.ttf', $text);
// $suffix = strtolower(strrchr($filename, '.'));
// switch($suffix){
// case '.jpg':
// case '.jpeg':
// $func = 'imagejpeg';break;
// case '.gif';
// $func = 'imagegif';break;
// case '.png';
// $func = 'imagepng';break;
// }
// $path = dirname($filename);
// $water = $path.'/w_'.basename($filename);
// $func($image, $water);
// imagedestroy($image);
// 将以上代码封装成给图片添加文字水印
/*
给图片加水印
1.添加文字水印
(1) 要把字体文件复制到放图片的这个文件夹里,例如这里用simhei.ttf字体
2.添加图片水印
*/
$filename = '1.jpeg';
//水印文字
$text = '这是一个文字水印';
$water = water_text($filename, $text);
//echo "<img src='$water' />";可以在这里输出值查看效果
//angle是水印角度
function water_text($filename, $text, $color='#FF0000', $size=30, $angle=0){
////////////////////////
//先拿到图片
///////////////////////
// imagecreatefromstring(); 返回一个图像标识符,其表达了从给定字符串得来的图像。图像格式将自动检测,只要 PHP 支持:JPEG,PNG,GIF,WBMP 和 GD2。就是自动检测图像类型(后缀)
// file_get_contents() 把整个文件读入一个字符串中。就是把一个文件打开,变成字符串
$image = imagecreatefromstring(file_get_contents($filename));
//对颜色的色码格式进行判定,要把16进制的色码转成10进制
//substr() 函数返回字符串的一部分.这里从第0位取值,只取一位
//判断有没有#号,如果没有#号,那么代表用户填错格式了,就给一个默认值黑色
//如果有#号,继续判断颜色值的长度是不是3位或者6位
//不是就是错的,给默认值黑色
//如果是3位或者6位
//判断1:是否有#号
if(substr($color, 0, 1) == '#'){
//水印颜色
$color = substr($color, 1);
//判断2:是否是3位或6位
if(strlen($color)==3 || strlen($color)==6){
//判断3:3位或6位分开处理
if(strlen($color) == 3){
//str_split 将一个字符串转为数组,并以每一个为单位分割
$color_arr = str_split($color, 1);
}else{
//str_split 将一个字符串转为数组,并以每两个为单位分割
$color_arr = str_split($color, 2);
}
//分割完了之后,把3位的色码变成6位
//如果$color_arr长度是1,就不用补全
//如果长度是2,就要补全成为6位,长度是1就不用管了
foreach($clolr_arr as $k=>$v){
if(strlen($v)==1){
$color_arr[$k] = $v.$v;
}
}
//hexdec 将16进制转成10进制
$red = hexdec($color_arr[0]);
$green = hexdec($color_arr[1]);
$blue = hexdec($color_arr[2]);
$color = imagecolorallocate($image, $red, $green, $blue);
}else{
$color = imagecolorallocate($image, 0, 0, 0);
}
}else{
//水印颜色
$color = imagecolorallocate($image, 0, 0, 0);
}
//水印开始坐标
$x = 0;
$y = 30;
////////////////////////
//然后写字
///////////////////////
imagettftext($image, $size, $angle, $x, $y, $color, 'simhei.ttf', $text);
////////////////////////
//最后生成图片
///////////////////////
//拿到图片后缀
//strtolower();将后缀全部转为小写,拿到的后缀有可能是大写的,先全部转成大写或小写都可以
$suffix = strtolower(strrchr($filename, '.'));
switch($suffix){
case '.jpg':
case '.jpeg':
//把这两种格式统一写成一种,本身这两个后缀都是同一个格式
//所以case后面的内容都是一样的,所以第一个case后面不用写
$func = 'imagejpeg';break;
case '.gif';
$func = 'imagegif';break;
case '.png';
$func = 'imagepng';break;
}
//拿到文件目录,就是存放原图的路径,然后给新图重新命名并添加路径
//dirname: 取一个文件的目录部分
//basename :取一个文件的文件部分,可以是去掉目录,也可以是去掉后缀
//因为原图和修改后的图在同一个文件夹,所以给每一个修改后的图加上一个w_
$path = dirname($filename);
$water = $path.'/w_'.basename($filename);
// 生成目标图片并保存
//imagejpeg($dst_image, 'thumb2.jpg');如果没有上面的switch,就要这样写
//判定后,用另一种写法
//用$thumb将图片名也换掉,并加上路径
$func($image, $water);
//销毁资源:
imagedestroy($image);
return $water;
}
?>
/*
给图片加水印
1.添加文字水印
(1) 要把字体文件复制到放图片的这个文件夹里,例如这里用simhei.ttf字体
2.添加图片水印
*/
$filename = '1.jpeg';
//水印文字
$text = '这是一个文字水印';
//最后一个参数是九宫格的位置
$water = water_text($filename, $text, '#990081', 2);
//echo "<img src='$water' />";可以在这里输出值查看效果
//angle是水印角度
//$position是是水印加在哪里(九宫格)
function water_text($filename, $text, $color='#FF0000', $position, $size=30, $angle=0){
////////////////////////
//先拿到图片
///////////////////////
// imagecreatefromstring(); 返回一个图像标识符,其表达了从给定字符串得来的图像。图像格式将自动检测,只要 PHP 支持:JPEG,PNG,GIF,WBMP 和 GD2。就是自动检测图像类型(后缀)
// file_get_contents() 把整个文件读入一个字符串中。就是把一个文件打开,变成字符串
$image = imagecreatefromstring(file_get_contents($filename));
//首先让三个色默认为0,不是0再在下面做判断
//如果不写=0,那么下面进行判断的时候,就会写一堆默认值为(0, 0, 0)的情况
//这就相当于首先默认是黑色,三个0就是黑色
$red=$green=$blue=0;
//对颜色的色码格式进行判定,要把16进制的色码转成10进制
//substr() 函数返回字符串的一部分.这里从第0位取值,只取一位
//判断有没有#号,如果没有#号,那么代表用户填错格式了,就给一个默认值黑色
//如果有#号,继续判断颜色值的长度是不是3位或者6位
//不是就是错的,给默认值黑色
//如果是3位或者6位
//判断1:是否有#号
if(substr($color, 0, 1) == '#'){
//水印颜色
$color = substr($color, 1);
//判断2:是否是3位或6位
if(strlen($color)==3 || strlen($color)==6){
//判断3:3位或6位分开处理
if(strlen($color) == 3){
//str_split 将一个字符串转为数组,并以每一个为单位分割
$color_arr = str_split($color, 1);
}else{
//str_split 将一个字符串转为数组,并以每两个为单位分割
$color_arr = str_split($color, 2);
}
//分割完了之后,把3位的色码变成6位
//如果$color_arr长度是1,就不用补全
//如果长度是2,就要补全成为6位,长度是1就不用管了
foreach($clolr_arr as $k=>$v){
if(strlen($v)==1){
$color_arr[$k] = $v.$v;
}
}
//hexdec 将16进制转成10进制
$red = hexdec($color_arr[0]);
$green = hexdec($color_arr[1]);
$blue = hexdec($color_arr[2]);
}
}
//imagecolorallocate — 为一幅图像分配颜色
$color = imagecolorallocate($image, $red, $green, $blue);
//加水印的位置:
//目标图的宽高已知
list($dst_w, $dst_h) = getimagesize($filename);
//水印的宽高计算:
//mb_strlen 计算字符长度
//高为0时,用$src_h代替,高为0时,自动加5,宽自动加10,这个数是估计来的,不是固定的。
//否则水印显示到图片外面去了
$src_w = ($size+10)*mb_strlen($text, 'utf-8');
$src_h = $size+5;
//水印坐标(九宫格)
switch($position){
case 1://左上角
//水印图在目标图上的位置
$dst_x = 0;
$dst_y = $size;
break;
case 2://上居中
//水印图在目标图上的位置
$dst_x = ($dst_w-$src_w)/2;
$dst_y = $src_h;
break;
case 3://右上角
//水印图在目标图上的位置
$dst_x = $dst_w-$src_w;
$dst_y = $src_h;
break;
case 4://左居中
//水印图在目标图上的位置
$dst_x = $src_h;
$dst_y = ($dst_h-$src_h)/2;
break;
case 5://居中
//水印图在目标图上的位置
$dst_x = ($dst_w-$src_w)/2;
$dst_y = ($dst_h-$src_h)/2;
break;
case 6://右居中
//水印图在目标图上的位置
$dst_x = $dst_w-$src_w;
$dst_y = ($dst_h-$src_h)/2;
break;
case 7://左下角
//水印图在目标图上的位置
$dst_x = 0;
$dst_y = $dst_h-$src_h;
break;
case 8://下居中
//水印图在目标图上的位置
$dst_x = ($dst_w-$src_w)/2;
$dst_y = $dst_h-$src_h;
break;
case 9://右下角
//水印图在目标图上的位置
$dst_x = $dst_w-$src_w;
$dst_y = $dst_h-$src_h;
break;
default:
$dst_x = 0;
$dst_y = $src_h;
}
////////////////////////
//然后写字
///////////////////////
imagettftext($image, $size, $angle, $dst_x, $dst_y, $color, 'simhei.ttf', $text);
////////////////////////
//最后生成图片
///////////////////////
//拿到图片后缀
//strtolower();将后缀全部转为小写,拿到的后缀有可能是大写的,先全部转成大写或小写都可以
$suffix = strtolower(strrchr($filename, '.'));
switch($suffix){
case '.jpg':
case '.jpeg':
//把这两种格式统一写成一种,本身这两个后缀都是同一个格式
//所以case后面的内容都是一样的,所以第一个case后面不用写
$func = 'imagejpeg';break;
case '.gif';
$func = 'imagegif';break;
case '.png';
$func = 'imagepng';break;
}
//拿到文件目录,就是存放原图的路径,然后给新图重新命名并添加路径
//dirname: 取一个文件的目录部分
//basename :取一个文件的文件部分,可以是去掉目录,也可以是去掉后缀
//因为原图和修改后的图在同一个文件夹,所以给每一个修改后的图加上一个w_
$path = dirname($filename);
$water = $path.'/w_'.basename($filename);
// 生成目标图片并保存
//imagejpeg($dst_image, 'thumb2.jpg');如果没有上面的switch,就要这样写
//判定后,用另一种写法
//用$thumb将图片名也换掉,并加上路径
$func($image, $water);
//销毁资源:
imagedestroy($image);
return $water;
}
/**
* 十六进制转RGB
*
* @param string $color 16进制颜色值
* @return array
*/
public static function hex2rgb($color) {
$hexColor = str_replace('#', '', $color);
$lens = strlen($hexColor);
if ($lens != 3 && $lens != 6) {
return false;
}
$newcolor = '';
if ($lens == 3) {
for ($i = 0; $i < $lens; $i++) {
$newcolor .= $hexColor[$i] . $hexColor[$i];
}
} else {
$newcolor = $hexColor;
}
$hex = str_split($newcolor, 2);
$rgb = [];
foreach ($hex as $key => $vls) {
$rgb[] = hexdec($vls);
}
return $rgb;
}
————————————————
版权声明:本文为CSDN博主「helcyon」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/helcyon/article/details/80855153
/**
* RGB转 十六进制
* @param $rgb RGB颜色的字符串 如:rgb(255,255,255);
* @return string 十六进制颜色值 如:#FFFFFF
*/
function RGBToHex($rgb){
$regexp = "/^rgb\(([0-9]{0,3})\,\s*([0-9]{0,3})\,\s*([0-9]{0,3})\)/";
$re = preg_match($regexp, $rgb, $match);
$re = array_shift($match);
$hexColor = "#";
$hex = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
for ($i = 0; $i < 3; $i++) {
$r = null;
$c = $match[$i];
$hexAr = array();
while ($c > 16) {
$r = $c % 16;
$c = ($c / 16) >> 0;
array_push($hexAr, $hex[$r]);
}
array_push($hexAr, $hex[$c]);
$ret = array_reverse($hexAr);
$item = implode('', $ret);
$item = str_pad($item, 2, '0', STR_PAD_LEFT);
$hexColor .= $item;
}
return $hexColor;
}
/**
* 十六进制 转 RGB
*/
function hex2rgb($hexColor) {
$color = str_replace('#', '', $hexColor);
if (strlen($color) > 3) {
$rgb = array(
'r' => hexdec(substr($color, 0, 2)),
'g' => hexdec(substr($color, 2, 2)),
'b' => hexdec(substr($color, 4, 2))
);
} else {
$color = $hexColor;
$r = substr($color, 0, 1) . substr($color, 0, 1);
$g = substr($color, 1, 1) . substr($color, 1, 1);
$b = substr($color, 2, 1) . substr($color, 2, 1);
$rgb = array(
'r' => hexdec($r),
'g' => hexdec($g),
'b' => hexdec($b)
);
}
return $rgb;
}
————————————————
版权声明:本文为CSDN博主「二東」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shaerdong/article/details/46805807
网友评论