完善压缩处理类(支持主流的图像类型(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框架在反向解 ...
随机推荐
- 转:MVC中的文件上传
上传文件与与上传数据区别 上传数据主要指json等简单字符串,上传文件指的是上传word.excel图片等.在上传数据的时候enctype默认为第一个application/x-www-form-ur ...
- 装配bean,基于xml
一.bean的实例化方式 1.默认构造 <bean id="" class=""></bean> 必须提供默认构造方法 2.静态工厂 用 ...
- 如何使用JWT来实现单点登录功能
我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不错. 个人理解,jwt就是类似于一把锁和钥匙,客户来租房(登录),我们需要给他进来(第一次登录)登记 ...
- python的字符串操作
1.修改大小写 (1)title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写.这很有用, 因为你经常需要将名字视为信息.例如,你可能希望程序将值Ada.ADA和ada视为同一个名 ...
- FTPUtil 多文件上传参考代码
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...
- Mono For Android如何在VS2012 中打开设计界面
刚接触 Mono For Android 没几天,不知不觉把设计界面弄丢了.辛辛苦苦才把设计界面弄出来,如果你在 Layout 下打开 *.xaml 的文件打开的却是 xml 文档,那么你可以按照 ...
- matlab练习程序(粒子群优化PSO)
算法没有和图像处理直接相关,不过对于图像分类中的模式识别相关算法,也许会用到这个优化算法. 算法步骤: 1.首先确定粒子个数与迭代次数. 2.对每个粒子随机初始化位置与速度. 3.采用如下公式更新每个 ...
- 关于Java虚拟机内存原型的基本知识
Java虚拟机内存原型的六个部分: 1.寄存器:我们在程序中无法控制 2.栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 3.堆:存放用new产生的数据 4.静态域:存放在 ...
- mac 下使用 ikbcG87 及使用 karabiner 改大小写键
前言 一直使用 mac ,对于机械键盘还处于刚入坑阶段,作为小白还是选择能够兼容 mac 的机械键盘,于是选择了 ikbcG87 "双子座" 1.使用 ikbc G87 mac 模 ...
- iis 7 操作 .net
下面说一下.NET对IIS7操作.IIS7的操作和IIS5/6(using system.DirectoryServices;使用类DirectoryEntry )有很大的不同,在IIS7里增加了 M ...