thinkphp给图片打水印不清晰
项目中打印条形码的函数,从thinkphp自带的water函数修改而来的。
贴上代码:
/**
* water2
* 改写thinkphp的water函数更强健的函数,增加了写入位置参数
去掉了alpha设定参数,以修正打出的水印不清晰的bug
* @param string $source 原图文件名
* @param string $water 水印图片文件名
* @param int $waterPos 要打水印的位置
* @param string $savename 要保存的图片名,如果留空则用source
* @return void
*/
function water2($source,$water,$waterPos=1,$savename=null)
{
import('ORG.Util.Image');
//检查文件是否存在
if(!file_exists($source)||!file_exists($water))
return false;
//图片信息
$sInfo=Image::getImageInfo($source);
$wInfo=Image::getImageInfo($water);
//如果图片小于水印图片,不生成图片
if($sInfo["width"]<$wInfo["width"] || $sInfo['height']<$wInfo['height'])
return false;
//建立图像
$sCreateFun="imagecreatefrom".$sInfo['type'];
$sImage=$sCreateFun($source);
$wCreateFun="imagecreatefrom".$wInfo['type'];
$wImage=$wCreateFun($water);
//设定图像的混色模式
imagealphablending($wImage, true);
switch($waterPos){
case 0://随机
$posX = rand(0,($sInfo["width"] - $wInfo["width"]));
$posY = rand(0,($sInfo["height"] - $wInfo["height"]));
break;
case 1://1为顶端居左
$posX = 8;
$posY = 8;
break;
case 2://2为顶端居中
$posX = ($sInfo["width"] - $wInfo["width"])/2;
$posY = 0;
break;
case 3://3为顶端居右
$posX = $sInfo["width"] - $wInfo["width"];
$posY = 0;
break;
case 4://4为中部居左
$posX = 0;
$posY = ($sInfo["height"] - $wInfo["height"])/2;
break;
case 5://5为中部居中
$posX = ($sInfo["width"] - $wInfo["width"])/2;
$posY = ($sInfo["height"] - $wInfo["height"])/2;
break;
case 6://6为中部居右
$posX = $sInfo["width"] - $wInfo["width"];
$posY = ($sInfo["height"] - $wInfo["height"])/2;
break;
case 7://7为底端居左
$posX = 0;
$posY = $sInfo["height"] - $wInfo["height"];
break;
case 8://8为底端居中
$posX = ($sInfo["width"] - $wInfo["width"])/2;
$posY = $sInfo["height"]- $wInfo["height"];
break;
case 9://9为底端居右
$posX = $sInfo["width"] - $wInfo["width"]-8;
$posY = $sInfo["height"] - $wInfo["height"]-8;
break;
default://随机
$posX = rand(0,($sInfo["width"] - $wInfo["width"]));
$posY = rand(0,($sInfo["height"] - $wInfo["height"]));
break;
}
//生成混合图像
//imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'],$wInfo['height'],$alpha);
imagecopy($sImage, $wImage,$posX, $posY, 0, 0,$wInfo["width"],$wInfo["height"]);
//输出图像
$ImageFun='Image'.$sInfo['type'];
//如果没有给出保存文件名,默认为原图像名
if(!$savename){
$savename=$source;
@unlink($source);
}
//保存图像
$ImageFun($sImage,$savename);
imagedestroy($sImage);
}
thinkphp中Image.class.php的getImageInfo方法:
/**
+----------------------------------------------------------
* 取得图像信息
*
+----------------------------------------------------------
* @static
* @access public
+----------------------------------------------------------
* @param string $image 图像文件名
+----------------------------------------------------------
* @return mixed
+----------------------------------------------------------
*/
static function getImageInfo($img) {
$imageInfo = getimagesize($img);
if( $imageInfo!== false) {
if(function_exists(image_type_to_extension)){
$imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
}else{
$imageType = strtolower(substr($img,strrpos($img,'.')+1));
}
$imageSize = filesize($img);
$info = array(
"width"=>$imageInfo[0],
"height"=>$imageInfo[1],
"type"=>$imageType,
"size"=>$imageSize,
"mime"=>$imageInfo['mime']
);
return $info;
}else {
return false;
}
}
thinkphp中的water函数:
/**
+----------------------------------------------------------
* 为图片添加水印
+----------------------------------------------------------
* @static public
+----------------------------------------------------------
* @param string $source 原文件名
* @param string $water 水印图片
* @param string $$savename 添加水印后的图片名
* @param string $alpha 水印的透明度
+----------------------------------------------------------
* @return string
+----------------------------------------------------------
* @throws ThinkExecption
+----------------------------------------------------------
*/
static public function water($source,$water,$savename=null,$alpha=80)
{
//检查文件是否存在
if(!file_exists($source)||!file_exists($water))
return false;
//图片信息
$sInfo=self::getImageInfo($source);
$wInfo=self::getImageInfo($water);
//如果图片小于水印图片,不生成图片
if($sInfo["width"]<$wInfo["width"] || $sInfo['height']<$wInfo['height'])
return false;
//建立图像
$sCreateFun="imagecreatefrom".$sInfo['type'];
$sImage=$sCreateFun($source);
$wCreateFun="imagecreatefrom".$wInfo['type'];
$wImage=$wCreateFun($water);
//设定图像的混色模式
imagealphablending($wImage, true);
//图像位置,默认为右下角右对齐
$posY=$sInfo["height"]-$wInfo["height"];
$posX=$sInfo["width"]-$wInfo["width"];
//生成混合图像
imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'],$wInfo['height'],$alpha);
//输出图像
$ImageFun='Image'.$sInfo['type'];
//如果没有给出保存文件名,默认为原图像名
if(!$savename){
$savename=$source;
@unlink($source);
}
//保存图像
$ImageFun($sImage,$savename);
imagedestroy($sImage);
}
thinkphp给图片打水印不清晰的更多相关文章
- thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印
今天分享一下thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印.博主是新手,在这里卡住了很久(>_<) thinkphp 3.2.3整合ueditor 1.4 下载 ...
- 火车头dede采集接口,图片加水印,远程图片本地化,远程无后缀的无图片本地化
<?php /* [LocoySpider] (C)2005-2010 Lewell Inc. 火车采集器 DedeCMS 5.7 UTF8 文章发布接口 Update content: 图片加 ...
- PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转
[强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...
- JAVA给图片加上水印
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java ...
- php 分享两种给图片加水印的方法
本文章向码农们介绍 php 给图片加水印的两种方法,感兴趣的码农可以参考一下本文章的源代码. 方法一:PHP最简单的加水印方法 <?php // http://www.manongjc.com ...
- Java图片处理(二)图片加水印
图片加水印,是通过图片重叠绘制实现的.实现代码如下: public static void press(String pressImg, String pressText, String target ...
- Nginx Image Module图片缩略图 水印处理模块
Nginx Image Module图片缩略图 水印处理模块 下载Tengine tar -zxvf tengine-1.4.5.tar.gz cd tengine-1.4.5 下载Nginx tar ...
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...
- 四:Java使用google的thumbnailator工具对图片压缩水印等做处理
Thumbnailator是一个非常好的图片开源工具 使用方法: 在pom中加入以下jar包 <!-- 图片缩略图 图片压缩 水印 start--> <dependency>& ...
随机推荐
- js与事件处理
1. <a href="javascript:showModalDialog('../TrainingReq/QryTermCourseInfo.aspx?TermCourseID=& ...
- [React Native] Passing data when changing routes
The way you make HTTP requests in React Native is with the Fetch API. In this video we'll talk about ...
- Android内存、性能是程序永恒的话题
内存.性能是程序永恒的话题,实际开发中关于卡顿.OOM也经常是打不完的两只老虎,关于卡顿.OOM的定位方法和工具比较多,这篇文章也不打算赘述了,本章主要是来整理一下JVM的内存模型以及Java对象的生 ...
- JS火狐与IE的差别
function isIE(){ //ie? ) return true; else return false; } if(!isIE()){ //firefox innerText define H ...
- 【排障】每次打开word都提示要安装配置
为什么每次打开word都提示要安装配置?很多人在打开word时,总是提示要安装配置一遍,花去不少时间,这是由于电脑里有两个不同版本的office软件,产生的原因可能是原来的卸载了没卸载干净,或是安装了 ...
- %s 与 %0s在 verilog中的区别
what is different between %s and %0s?(%s和%零s) %s prints the string as it is with spaces at the begin ...
- UNIX线程之间的关系
我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1. 主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...
- JQ动画事件
1.会飞的li html: <ul id="ulL"> <li>中国</li> <li>美国</li> <li&g ...
- 【转载】Oracle层次查询和分析函数
摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...
- mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法
补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题. 背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机 ...