<?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
<?php
//图片缩略:固定大小,并保证图片不变形
//先创建一个小的画布尺寸,然后把要缩的图片按坐标放到这个画布上,最后再把这个画布存起来,就完成缩略图了
//用GD库中的 imagecopyresampled(); 函数
// 这有一个问题,如果画布尺寸和原图尺寸比例不一样,缩小后就会变形(拉伸)
$filename = 'public/uploads/images/20191020/1.jpg';
//getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_WARNING级的错误信息。
//把获取到的数组中的值赋给list函数中的变量
list($src_w, $src_h) = getimmagesize($filename);
//目标尺寸:如果不在前面设置缩放比例,也可以在这里直接写固定尺寸
//$dst_w = 200; $dst_h = 300; 但是这样写会变形,要想他不变形,就要算好原图的比例,这里用计算原图宽高比例然后缩放的方式等比例缩放的方式,等比例缩放的方式在1.php
$dst_w = 300;
$dst_h = 200;
//计算原图宽高比例
$src_scale = $src_w/$src_h;
//然后要拿到目标图的宽高比
$dst_scale = $src_w/$src_h;
//如果原图和目标图比例不一致,需要分具体情况解决
//分为原图比目标图大和原图比目标图小的情况,比例相等就不用处理了
if($src_scale > $dst_scale){
}else{
$dst_x = 0;
$dst_y = 0;
}
/*
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
源图象的高度。
*/
//计算: 原图的宽/目标图的宽
$per1 = $dst_w/$src_w;
//计算: 原图的高/目标图的高
$per2 = $dst_h/$src_h;
//上面计算好了原图和目标图的宽高比例,哪一个比例小,就取哪一个作为计算的比例,如果用大的那一个,会超出画布(目标图)
$per = min($per1, $per2);
$new_dst_w = $src_w*$per;
$new_dst_h = $src_h*$per;
//修改过后的图应该从这个坐标开始铺:(原宽、高 - 新宽、高)/2,让图片正好居中显示
$dst_x = ($dst_w-$new_dst_w)/2;
$dst_y = ($dst_h-$new_dst_h)/2;
// 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);
//把背景颜色从黑色变成白色
$white = imagecolorallocate($dst_image, 255, 255, 255);
imagefill($dst_image, 0, 0, $white);
imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, 0, 0, $new_dst_w, $new_dst_h, $src_w, $src_h);
//拿到图片后缀
//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 :取一个文件的文件部分,可以是去掉目录,也可以是去掉后缀
//因为原图和修改后的图在同一个文件夹,所以给每一个修改后的图加上一个s_
$path = dirname($filename);
$thumb = $path.'/s_'.basename($filename);
// 生成目标图片并保存
//imagejpeg($dst_image, 'thumb2.jpg');如果没有上面的switch,就要这样写
//判定后,用另一种写法
//用$thumb将图片名也换掉,并加上路径
$func($dst_image, $thumb);
//销毁资源:两个资源,原图像和生成的图像
imagedestroy($src_image);
imagedestroy($dst_image);
?>
?>
<?php
<?php
//图片缩略:保证图片不变形
//先创建一个小的画布尺寸,然后把要缩的图片按坐标放到这个画布上,最后再把这个画布存起来,就完成缩略图了
//用GD库中的 imagecopyresampled(); 函数
// 这有一个问题,如果画布尺寸和原图尺寸比例不一样,缩小后就会变形(拉伸)
$filename = 'public/uploads/images/20191020/1.jpg';
//getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_WARNING级的错误信息。
//把获取到的数组中的值赋给list函数中的变量
list($src_w, $src_h) = getimmagesize($filename);
//目标尺寸:如果不在前面设置缩放比例,也可以在这里直接写固定尺寸
//$dst_w = 200; $dst_h = 300; 但是这样写会变形,要想他不变形,就要算好原图的比例,这里用计算原图宽高比例然后缩放的方式等比例缩放的方式,等比例缩放的方式在1.php
$dst_w = 300;
$dst_h = 200;
//计算原图宽高比例
$src_scale = $src_w/$src_h;
//然后要拿到目标图的宽高比
$dst_scale = $src_w/$src_h;
//如果原图和目标图比例不一致,需要分具体情况解决
//分为原图比目标图大和原图比目标图小的情况,比例相等就不用处理了
if($src_scale > $dst_scale){
}else{
$dst_x = 0;
$dst_y = 0;
}
/*
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
源图象的高度。
*/
//计算: 原图的宽/目标图的宽
$per1 = $dst_w/$src_w;
//计算: 原图的高/目标图的高
$per2 = $dst_h/$src_h;
//上面计算好了原图和目标图的宽高比例,哪一个比例小,就取哪一个作为计算的比例,如果用大的那一个,会超出画布(目标图)
$per = min($per1, $per2);
$new_dst_w = $src_w*$per;
$new_dst_h = $src_h*$per;
//修改过后的图应该从这个坐标开始铺:(原宽、高 - 新宽、高)/2,让图片正好居中显示
$dst_x = 0;
$dst_y = 0;
// 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($new_dst_w, $new_dst_h);
imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, 0, 0, $new_dst_w, $new_dst_h, $src_w, $src_h);
// 生成目标图片并保存
imagejpeg($dst_image, 'thumb2.jpg');
//销毁资源:两个资源,原图像和生成的图像
imagedestroy($src_image);
imagedestroy($dst_image);
?>
?>
<?php
//图片缩略:固定大小,并保证图片不变形
//先创建一个小的画布尺寸,然后把要缩的图片按坐标放到这个画布上,最后再把这个画布存起来,就完成缩略图了
//用GD库中的 imagecopyresampled(); 函数
// 这有一个问题,如果画布尺寸和原图尺寸比例不一样,缩小后就会变形(拉伸)
$filename = 'public/uploads/images/20191020/1.jpg';
//目标尺寸:如果不在前面设置缩放比例,也可以在这里直接写固定尺寸
//$dst_w = 200; $dst_h = 300; 但是这样写会变形,要想他不变形,就要算好原图的比例,这里用计算原图宽高比例然后缩放的方式等比例缩放的方式,等比例缩放的方式在1.php
$dst_w = 300;
$dst_h = 200;
//调用函数
thumb($filename, $dst_w, $dst_h, false);
//默认参数还需要一个是否固定宽高,默认是
function thumb($filename, $dst_w=0, $dst_h=0, $is_fixed=true){
//getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_WARNING级的错误信息。
//把获取到的数组中的值赋给list函数中的变量
list($src_w, $src_h) = getimmagesize($filename);
//计算原图宽高比例
$src_scale = $src_w/$src_h;
//然后要拿到目标图的宽高比
$dst_scale = $src_w/$src_h;
//如果原图和目标图比例不一致,需要分具体情况解决
//分为原图比目标图大和原图比目标图小的情况,比例相等就不用处理了
if($src_scale > $dst_scale){
}else{
$dst_x = 0;
$dst_y = 0;
}
/*
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
源图象的高度。
*/
//计算: 原图的宽/目标图的宽
$per1 = $dst_w/$src_w;
//计算: 原图的高/目标图的高
$per2 = $dst_h/$src_h;
//上面计算好了原图和目标图的宽高比例,哪一个比例小,就取哪一个作为计算的比例,如果用大的那一个,会超出画布(目标图)
$per = min($per1, $per2);
$new_dst_w = $src_w*$per;
$new_dst_h = $src_h*$per;
//修改过后的图应该从这个坐标开始铺:(原宽、高 - 新宽、高)/2,让图片正好居中显示
$dst_x = ($dst_w-$new_dst_w)/2;
$dst_y = ($dst_h-$new_dst_h)/2;
// 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);
//把背景颜色从黑色变成白色
$white = imagecolorallocate($dst_image, 255, 255, 255);
imagefill($dst_image, 0, 0, $white);
imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, 0, 0, $new_dst_w, $new_dst_h, $src_w, $src_h);
//拿到图片后缀
//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 :取一个文件的文件部分,可以是去掉目录,也可以是去掉后缀
//因为原图和修改后的图在同一个文件夹,所以给每一个修改后的图加上一个s_
$path = dirname($filename);
$thumb = $path.'/s_'.basename($filename);
// 生成目标图片并保存
//imagejpeg($dst_image, 'thumb2.jpg');如果没有上面的switch,就要这样写
//判定后,用另一种写法
//用$thumb将图片名也换掉,并加上路径
$func($dst_image, $thumb);
//销毁资源:两个资源,原图像和生成的图像
imagedestroy($src_image);
imagedestroy($dst_image);
return $thumb;
}
?>
https://www.youhutong.com/index.php/article/index/139.html
<?php
// +----------------------------------------------------------------------
// | 把大图缩略到缩略图指定的范围内,可能有留白(原图细节不丢失)
// +----------------------------------------------------------------------
$w = $_GET['w']?$_GET['w']:200;
$h = $_GET['h']?$_GET['h']:200;
$filename = "stand_test_".$w."_".$h.".jpg";
image_resize( 'test.jpg',$filename, $w, $h);
header("content-type:image/png");//设定生成图片格式
echo file_get_contents($filename);
function image_resize($f, $t, $tw, $th){
// 按指定大小生成缩略图,而且不变形,缩略图函数
$temp = array(1=>'gif', 2=>'jpeg', 3=>'png');
list($fw, $fh, $tmp) = getimagesize($f);
if(!$temp[$tmp]){
return false;
}
$tmp = $temp[$tmp];
$infunc = "imagecreatefrom$tmp";
$outfunc = "image$tmp";
$fimg = $infunc($f);
// 使缩略后的图片不变形,并且限制在 缩略图宽高范围内
if($fw/$tw > $fh/$th){
$th = $tw*($fh/$fw);
}else{
$tw = $th*($fw/$fh);
}
$timg = imagecreatetruecolor($tw, $th);
imagecopyresampled($timg, $fimg, 0,0, 0,0, $tw,$th, $fw,$fh);
if($outfunc($timg, $t)){
return true;
}else{
return false;
}
}
?>
<?php
// +----------------------------------------------------------------------
// | 把大图缩略到缩略图指定的范围内,不留白(原图会居中缩放,把超出的部分裁剪掉)
// +----------------------------------------------------------------------
$w = $_GET['w']?$_GET['w']:200;
$h = $_GET['h']?$_GET['h']:200;
$filename = "cut_test_".$w."_".$h.".jpg";
image_resize( 'test.jpg',$filename, $w, $h);
header("content-type:image/png");//设定生成图片格式
echo file_get_contents($filename);
// 按指定大小生成缩略图,而且不变形,缩略图函数
function image_resize($f, $t, $tw, $th){
$temp = array(1=>'gif', 2=>'jpeg', 3=>'png');
list($fw, $fh, $tmp) = getimagesize($f);
if(!$temp[$tmp]){
return false;
}
$tmp = $temp[$tmp];
$infunc = "imagecreatefrom$tmp";
$outfunc = "image$tmp";
$fimg = $infunc($f);
// $fw = 10;
// $fh = 4;
// $tw = 4;
// $th = 2;
// 把图片铺满要缩放的区域
if($fw/$tw > $fh/$th){
$zh = $th;
$zw = $zh*($fw/$fh);
$_zw = ($zw-$tw)/2;
}else{
$zw = $tw;
$zh = $zw*($fh/$fw);
$_zh = ($zh-$th)/2;
}
// echo $zw."<br>";
// echo $zh."<br>";
// echo $_zw."<br>";
// echo $_zh."<br>";
// exit;
$zimg = imagecreatetruecolor($zw, $zh);
// 先把图像放满区域
imagecopyresampled($zimg, $fimg, 0,0, 0,0, $zw,$zh, $fw,$fh);
// 再截取到指定的宽高度
$timg = imagecreatetruecolor($tw, $th);
imagecopyresampled($timg, $zimg, 0,0, 0+$_zw,0+$_zh, $tw,$th, $zw-$_zw*2,$zh-$_zh*2);
//
if($outfunc($timg, $t)){
return true;
}else{
return false;
}
}
?>
<?php
// +----------------------------------------------------------------------
// | 把大图缩略到缩略图指定的范围内,不留白(原图会剪切掉不符合比例的右边和下边)
// +----------------------------------------------------------------------
$w = $_GET['w']?$_GET['w']:200;
$h = $_GET['h']?$_GET['h']:200;
$filename = "strict_test_".$w."_".$h.".jpg";
image_resize( 'test.jpg',$filename, $w, $h);
header("content-type:image/png");//设定生成图片格式
echo file_get_contents($filename);
function image_resize($f, $t, $tw, $th){
// 按指定大小生成缩略图,而且不变形,缩略图函数
$temp = array(1=>'gif', 2=>'jpeg', 3=>'png');
list($fw, $fh, $tmp) = getimagesize($f);
if(!$temp[$tmp]){
return false;
}
$tmp = $temp[$tmp];
$infunc = "imagecreatefrom$tmp";
$outfunc = "image$tmp";
$fimg = $infunc($f);
if($fw/$tw > $fh/$th){
$fw = $tw * ($fh/$th);
}else{
$fh = $th * ($fw/$tw);
}
$timg = imagecreatetruecolor($tw, $th);
imagecopyresampled($timg, $fimg, 0,0, 0,0, $tw,$th, $fw,$fh);
if($outfunc($timg, $t)){
return true;
}else{
return false;
}
}
?>
网友评论