完善压缩处理类(支持主流的图像类型(jpg、png、gif)
<?php
/*
* 图像压缩
*/
class Thumb
{
//成员属性
private $file; //原图文件
private $thumb_path; //压缩文本件保存的地址
//创建原图资源的函数(文件的mime类型和创建资源的映射关系)
private $create_func = array(
'image/png' => 'imagecreatefrompng',
'image/jpeg' => 'imagecreatefromjpeg',
'image/gif' => 'imagecreatefromgif'
);
//保存图像资源的函数
private $output_func = array(
'image/png' => 'imagepng',
'image/jpeg' => 'imagejpeg',
'image/gif' => 'imagegif'
);
//图像的mime类型
private $mime; public function __set($p,$v)
{
if(property_exists($this, $p)){
$this->$p = $v;
}
}
public function __get($p)
{
if(property_exists($this, $p)){
return $this->$p;
}
} //构造函数用来初始化属性
public function __construct($file)
{
if(!file_exists($file)){
echo '文件无效,请选择正确的文件';
exit;
}
//执行到中这里,说明文件有效
$this->file = $file;
$this->mime = getimagesize($file)['mime'];
} //参数1:压缩的范围宽度
//参数2:压缩的范围的高度
function makeThumb($area_w,$area_h)
{
//参数2:原图资源(将该图片资源压缩之后,再保存到目的地画布中)
$create_func = $this->create_func;
$src_image = $create_func[$this->mime]($this->file);
//参数3、4:目的地(画布的起点坐标)
$dst_x = 0;
$dst_y = 0;
//参数5、6:原图的(起点坐标)
$src_x = 0;
$src_y = 0;
//参数9、10:原图的宽度、高度
//通过imagesx()函数获得图像资源的宽度、imagesy()获得图像资源的高度
$src_w = imagesx($src_image);
$src_h = imagesy($src_image); //参数7、8:目的地(画布的宽度、高度)
//计算压缩的比例
if($src_w / $area_w >= $src_h / $area_h){
$scale = $src_w / $area_w;
}else{
$scale = $src_h / $area_h;
} $dst_w = (int)$src_w / $scale;
$dst_h = (int)$src_h / $scale; //参数1:目的地图像资源(通常指的是画布资源)
$dst_image = imagecreatetruecolor($dst_w, $dst_h);
$color = imagecolorallocate($dst_image, 255, 255, 255);
$color = imagecolortransparent($dst_image,$color); imagefill($dst_image, 0, 0, $color); imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); //可以保存、也可以输出到浏览器
//1. imagepng()增加第二个参数表示保存文件
//通常会把压缩之后的图片保存到thumb子目录中,按照日期格式的子目录保存
$sub_path = date('Ymd').'/';
$path = $this -> thumb_path;
if(!is_dir($path.$sub_path)){
mkdir($path.$sub_path,0777,true);
}
//thumb/20170402/
//压缩的图像的文件名,在原文件名的基础上增加前缀:thumb_bs.png
$origin_filename = basename($this->file);
$thumb_name = 'thumb_'.$origin_filename; //header("Content-Type:image/png");
$output_func = $this->output_func;
$output_func[$this->mime]($dst_image,$path.$sub_path.$thumb_name); //最后,一定要把文件地址返回(接收之后最后保存起来)
return $sub_path.$thumb_name;
}
} $thumb = new Thumb('bs.png');
$thumb -> thumb_path = 'thumb/';
$file = $thumb -> makeThumb(50, 50);
var_dump($file);
完善压缩处理类(支持主流的图像类型(jpg、png、gif)的更多相关文章
- Opencv 使用Stitcher类图像拼接生成全景图像
Opencv中自带的Stitcher类可以实现全景图像,效果不错.下边的例子是Opencv Samples中的stitching.cpp的简化,源文件可以在这个路径里找到: \opencv\sourc ...
- hadoop对于压缩文件的支持及算法优缺点
hadoop对于压缩文件的支持及算法优缺点 hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果 ...
- Android开发调试日志工具类[支持保存到SD卡]
直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...
- 支持异步写入的日志类,支持Framework2.0
因为工作需要需要在XP上运行一个C#编写的Winform插件,我就用Framework2.0,因为存在接口交互所以想保留交易过程的入参出参. 考虑到插件本身实施的因素,就没有使用Log4.NLog等成 ...
- hadoop对于压缩文件的支持
转载:https://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html hadoop对于压缩格式的是透明识别,我们的MapReduce ...
- 自动检测GD库支持的图像类型
以下代码通过自动检测GD库支持的图像类型 来写出移直性更好的PHP代码 <?php if(function_exists("imagegif")){ header(" ...
- LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”
我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...
- LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”(笔记)
今天使用使用动态查询的时候出现出现错误“LINQ to Entities 不支持 LINQ 表达式节点类型‘Invoke’.”,代码如下: IQueryable<CUSTOMER> que ...
- POJO类中的任何布尔类型的变量,都不要加is
POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误. 定义为基本数据类型boolean isSuccess:的属性,它的方法也是isSuccess(),HSF框架在反向解 ...
随机推荐
- .NET通过PowerShell操作ExChange为用户开通邮箱教程
转:http://www.cnblogs.com/gongguo/archive/2012/03/12/2392049.html =================================== ...
- dll托管于非托管
托管的DLL组件可以在VS 直接添加引用,在使用using dll的文件命名空间就可以使用 非托管的DLL组件,只能通过using system.Runtime.InteropServices:引入 ...
- (转)Entity Framework4.1实现动态多条件查询、分页和排序
原文:http://www.cnblogs.com/ahui/archive/2011/08/04/2127282.html EF通用的分页实现: 1 2 3 4 5 6 7 8 9 10 11 12 ...
- centos系统安装mysql
方式一. 通过yum install mysql-server安装mysql服务器.chkconfig mysqld on设置开机启动,并service mysqld start启动mysql服务,并 ...
- carousel 插件隐藏列表中几项导致左右切换出错
1. 一般的应用场景: 用于左右快速切换显示的列表内容,比如对员工的切换. 对于这种情况必不可少需要按照部门进行搜索,目前我的做法是首次加载所有该用户可以查看的员工列表,选择部门后又选择的隐藏掉其他不 ...
- react-router + redux + react-redux 的例子与分析
一个 react-router + redux + react-redux 的例子与分析 index.js import React from 'react' import ReactDom fr ...
- [一个小问题]Mainfest配置文件的version问题小结
问题起源自己安装好产品的新build,然后用自己本地编译出来的其中一个DLL去替换到产品中,本来以为可以正常执行,但是却发现这个新DLL无法被Load,无法被使用. 从Event Viewer里找到了 ...
- Linux命令之查看日志等实时文件命令(less 、tail)使用
一.less的使用 1)less 文件名,即可快速打开文件 2)相关查看搜索 3)利用键盘向上向下箭头键盘上的向上和向下箭头,点击一次向下简单,文件内容往下读取一行:点击一次向上箭头,文件内容,往上 ...
- Verilog三线 - 八线译码器
参阅了一些书籍和网上的写法,在此Mark. 布尔表达式法 module decode3_8_assign (data_in,data_out,enable);//算法实现 :] data_in; in ...
- framework7 手风琴页面有滚动条时再次点开手风琴item滑动里面内容消失的解决方法
在手风琴的ul外面的div加入最小高度min-height:1000px,问题解决 示例代码: <div class="list-block accordion-list" ...