<?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)的更多相关文章

  1. Opencv 使用Stitcher类图像拼接生成全景图像

    Opencv中自带的Stitcher类可以实现全景图像,效果不错.下边的例子是Opencv Samples中的stitching.cpp的简化,源文件可以在这个路径里找到: \opencv\sourc ...

  2. hadoop对于压缩文件的支持及算法优缺点

    hadoop对于压缩文件的支持及算法优缺点   hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果 ...

  3. Android开发调试日志工具类[支持保存到SD卡]

    直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...

  4. 支持异步写入的日志类,支持Framework2.0

    因为工作需要需要在XP上运行一个C#编写的Winform插件,我就用Framework2.0,因为存在接口交互所以想保留交易过程的入参出参. 考虑到插件本身实施的因素,就没有使用Log4.NLog等成 ...

  5. hadoop对于压缩文件的支持

    转载:https://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html hadoop对于压缩格式的是透明识别,我们的MapReduce ...

  6. 自动检测GD库支持的图像类型

    以下代码通过自动检测GD库支持的图像类型 来写出移直性更好的PHP代码 <?php if(function_exists("imagegif")){ header(" ...

  7. LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”

    我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...

  8. LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”(笔记)

    今天使用使用动态查询的时候出现出现错误“LINQ to Entities 不支持 LINQ 表达式节点类型‘Invoke’.”,代码如下: IQueryable<CUSTOMER> que ...

  9. POJO类中的任何布尔类型的变量,都不要加is

    POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误. 定义为基本数据类型boolean isSuccess:的属性,它的方法也是isSuccess(),HSF框架在反向解 ...

随机推荐

  1. node搭环境

    node是javascript的运行环境,npm是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等). 一.安装node 1.在https://nodejs.org/en/do ...

  2. sql数据库基础知识整理,常用函数及常用语法

    1常用数据库聚合函数max()min()sum()avg()count() 2字符串处理函数len() 与 datalength()  区别:len是返回字符长度  datalength是返回字节长度 ...

  3. 将php代码部署到新浪云测试(简单方法,包含数据库的连接)

    很多人做项目都是先在本地测试然后上传到服务器运行,如果包含了操作数据库的信息往往需要进行一番调试,这里我总结一下把php代码包含数据库的连接如何上传到新浪云服务器的步骤. 1.在新浪云应用SAE的控制 ...

  4. 使用windows资源管理器打开jar

    在命令行里输入: assoc .jar=CompressedFolder

  5. lrzsz的使用

    可以方便的在本地PC机和远程服务器之间传输文件. 1.下载 直接在centos上执行命令yum -y install lrzsz 2.上传文件 rz // 上传文件,执行命令rz,会跳出文件选择窗口, ...

  6. MySQL免安装版中 my-default.ini 的配置

    拷贝一份  “my-default.ini”  文件 重命名为 “my.ini” 这样根目录下就有两个.ini文件了 一个是my-default.ini 一个是my.ini 接下来我们只需修改my.i ...

  7. HCNA配置console线路密码password认证

    1.华为设备配置主机名<Huawei>system    <Huawei>system-view Enter system view, return user view wit ...

  8. oracle 11g expdp impdp详细使用方法

    11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法如下图: 二.oracle10g以后提供了expdp/impdp工具,同样可以解决此问题 1.导出expdp工具使用方法: ...

  9. 解决使用phpmyadmin导出导入数据库时提示的“超出长度”、“超时”问题

    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求 1. 修改IIS的applicationhost.config a.文件位置: %windir%/system32/inetsrv/config/ ...

  10. 在你的andorid设备上运行netcore (Linux Deploy)

    最近注意到.net core 的新版本已经开始支持ARM 平台的CPU, 特意去Linux Deploy 中尝试了一下,真的可以运行 Welcome to Ubuntu 16.04 LTS (GNU/ ...