PHP 图像尺寸大小缩放(缩略图)及图片水印等处理并以 MySQL 存储

作者:wiLdGoose 发布时间:2016 年 10 月 2 日 分类:技术 Technology 暂无评论

这是在一个 BT 的运行环境下诞生的需求,折腾数日,写下来自己马克一下。

1、需求:

1.1、表单上传本地图片;
1.2、以指定最大宽或指定最大高处理缩略图;
1.3、以指定最大宽高缩放原图并添加图片水印;
1.4、缩略图及水印图须连同原图一同入库存储。

2、函数部分:

2.1、获取图片信息函数

function get_image_info($file) {
    $result = getimagesize($file);
    $info = array();
    $info['width'] = $result[0];
    $info['height'] = $result[1];
    $info['type'] = $result[2];
    return $info;
}

2.2、原图宽高与缩放宽高运算函数

function fix_image_size($source_width, $source_height, $max_width, $max_height) {
    $size = array();
    if ($max_width == false) {
        if ($max_height < $source_height) {
            $size['width'] = $max_width < $source_width ? floor($max_height / ($source_height / $source_width)) : $source_width;
            $size['height'] = $max_height;
        }
        else {
            $size['width'] = $source_width;
            $size['height'] = $source_height;
        }
    }
    elseif ($max_height == false) {
        if ($max_width < $source_width) {
            $size['width'] = $max_width;
            $size['height'] = $max_height < $source_height ? floor($max_width / ($source_width / $source_height)) : $source_height;
        }
        else {
            $size['width'] = $source_width;
            $size['height'] = $source_height;
        }
    }
    else {
        if (($max_width && $source_width > $max_width) || ($max_height && $source_height > $max_height)) {
            if ($max_width && $source_width > $max_width) {
                $width_ratio = $max_width / $source_width;
                $resize_width_tag = true;
            }
            if ($max_height && $source_height > $max_height) {
                $height_ratio = $max_height / $source_height;
                $resize_height_tag = true;
            }
            if ($resize_width_tag && $resize_height_tag) $ratio = $width_ratio < $height_ratio ? $width_ratio : $height_ratio;
            if ($resize_width_tag && !$resize_height_tag) $ratio = $width_ratio;
            if ($resize_height_tag && !$resize_width_tag) $ratio = $height_ratio;
            $size['width'] = floor($source_width * $ratio);
            $size['height'] = floor($source_height * $ratio);
        }
        else {
            $size['width'] = $source_width;
            $size['height'] = $source_height;
        }
    }
    return $size;
}

2.3、缩略图处理函数

function resize_image($source_image_string, $source_width, $source_height, $resize_width, $resize_height) {
    if (!empty($source_image_string) && !empty($source_width) && !empty($source_height) && (!empty($resize_width) || !empty($resize_height))) {
        $resize_image = imagecreatetruecolor($resize_width, $resize_height);
        $source_image = imagecreatefromstring(base64_decode($source_image_string));
        if (function_exists('imagecopyresampled')) imagecopyresampled($resize_image, $source_image, 0, 0, 0, 0, $resize_width, $resize_height, $source_width, $source_height);
        else imagecopyresized($resize_image, $source_image, 0, 0, 0, 0, $resize_width, $resize_height, $source_width, $source_height);
        $image_stream = array();
        ob_start();
        imagejpeg($resize_image, null, 100);
        $image_stream['data'] = ob_get_contents();
        $image_stream['length'] = ob_get_length();
        ob_end_clean();
        if (!empty($image_stream['data']) && $image_stream['length'] > 0) {
            imagedestroy($source_image);
            imagedestroy($resize_image);
            return $image_stream;
        }
        else return false;
    }
    else return false;
}

2.4、图片水印处理函数

function watermark_image($source_image_string, $source_width, $source_height, $watermark_image_file) {
    if (!empty($source_image_string) && !empty($source_width) && !empty($source_height) && !empty($watermark_image_file)) {
        $source_image = imagecreatefromstring(base64_decode($source_image_string));
        $watermark_image_info = get_image_info($watermark_image_file);
        if ($watermark_image_info['type'] == 1) $watermark_image = imagecreatefromgif($watermark_image_file);
        elseif ($watermark_image_info['type'] == 2) $watermark_image = imagecreatefromjpeg($watermark_image_file);
        elseif ($watermark_image_info['type'] == 3) $watermark_image = imagecreateFrompng($watermark_image_file);
        else return false;
        if (empty($watermark_image)) return false;
        $x = $source_width - $watermark_image_info['width'];
        $y = $source_height - $watermark_image_info['height'];
        imagecopy($source_image, $watermark_image, $x, $y, 0, 0, $watermark_image_info['width'], $watermark_image_info['height']) or die('Error');
        ob_start();
        imagejpeg($source_image, null, 100);
        $image_stream['data'] = ob_get_contents();
        $image_stream['length'] = ob_get_length();
        ob_end_clean();
        if (!empty($image_stream['data']) && $image_stream['length'] > 0) {
            imagedestroy($source_image);
            imagedestroy($watermark_image);
            return $image_stream;
        }
        else return false;
    }
    return false;
}

3、调用部分

3.1、表单数据获取

$attach_type = $_FILES['attach']['type'];
$attach_tmp_name = $_FILES['attach']['tmp_name'];
$attach_error = $_FILES['attach']['error'];
$attach_size = $_FILES['attach']['size'];

3.2、元数据处理

$source_image_file = $attach_tmp_name;
$source_image_info = get_image_info($source_image_file);
$source_image_string = base64_encode(file_get_contents($source_image_file));

3.3、入库原图处理

$fp_original_image = fopen($attach_tmp_name, 'rb');
if (!$fp_original_image) die('Error');
$original_image_content = addslashes(fread($fp_original_image, filesize($attach_tmp_name)));
fclose($fp_original_image);
unlink($attach_tmp_name);

3.4、缩略图处理

$thumbnail_image_width = 300;
$thumbnail_image_height = false;
$thumbnail_image_size = fix_image_size($source_image_info['width'], $source_image_info['height'], $thumbnail_image_width, $thumbnail_image_height);
$thumbnail_image = resize_image($source_image_string, $source_image_info['width'], $source_image_info['height'], $thumbnail_image_size['width'], $thumbnail_image_size['height']);
if (empty($thumbnail_image['data']) || $thumbnail_image['length'] <= 0) die('Error');

3.5、图片水印定义

$watermark_image_file = 'path/to/watermark.png';
$watermark_image_width = 900;
$watermark_image_height = 600;
$watermark_image_size = fix_image_size($source_image_info['width'], $source_image_info['height'], $watermark_image_width, $watermark_image_height);

3.6、处理水印前缩放处理

$watermark_resize_image = resize_image($source_image_string, $source_image_info['width'], $source_image_info['height'], $watermark_image_size['width'], $watermark_image_size['height']);
if (empty($watermark_resize_image['data']) || $watermark_resize_image['length'] <= 0) die('Error');

3.7、水印处理

$watermark_image = watermark_image(base64_encode($watermark_resize_image['data']), $watermark_image_size['width'], $watermark_image_size['height'], $watermark_image_file);
if (empty($watermark_image['data']) || $watermark_image['length'] <= 0) die('Error');

4、返回值

4.1、图片类型

$attach_type

4.2、原图

4.2.1、原图二进制数据

$original_image_content

4.2.2、原图大小

$attach_size

4.3、缩略图

4.3.1、缩略图二进制数据

addslashes($thumbnail_image['data'])

4.3.2、缩略图大小

$thumbnail_image['length']

4.4、水印图

4.4.1、水印图二进制数据

addslashes($watermark_image['data'])

4.4.2、水印图大小

$watermark_image['length']

5、入库 SQL 构造

略。

- EOF -

喂!还活着吗?

作者:wiLdGoose 发布时间:2016 年 3 月 20 日 分类:技术 Technology 6 条评论

本博自 2012 年光荣地被 GFW 认证后,长期流亡海外。辗转香港、日本、美国等地,依然在高墙之外。2014 年的时候,眼看我的域名邮箱都收不到来自墙内的邮件,再也坐不住了。后来通过一些技术方式调整了部署,邮箱恢复正常,本博也终于得见天日。

三年多的时间发生了什么?我不能告诉你。只能说我也做了很多事情,唯一值得庆幸的是,我终于离开了互联网行业。这种感觉也正如同围城效应,现在反思前后,居然还有些许不舍。再值得庆幸的是,互联网就在我们身边。你玩儿,或者不玩儿,Ta 都在这里。每时每刻、不离不弃。

最近又遇到一件事情让我重操旧业。作为重度 Google 用户,已经具备常年与 GFW 作斗争的经验。然而在各种两会各种峰会的轮番轰炸下,梯子一个一个倒下去。SSH 转 Socks5 的方式早已落伍,各种 VPN 服务也在挣扎。为了能够更愉快地玩耍,我决定自食其力。

首先要有一台墙外的服务器或者 VPS。现在阿里云、腾讯云等各种云都做得不错,价格也亲民(我用的不是上述服务商,别问为什么,谢谢)。操作系统 CentOS,开始:

检查内核环境是否包含 mppe,是否支持 pptp。CentOS 6.4 内核版本在 2.6.15 以上,都已默认集成。

cat /dev/ppp
cat /dev/net/tun

安装 ppp、防火墙与 pptpd:

yum install -y ppp iptables
wget -c http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.x86_64.rpm
rpm -Uhv pptpd-1.4.0-1.el6.x86_64.rpm
yum install pptpd

修改配置文件中的 DNS 为 8.8.8.8 和 8.8.4.4:

vi /etc/ppp/options.pptpd

配置 VPN 账户:

vi /etc/ppp/chap-secrets

配置客户端分配到内网的 IP 地址,记得在最后加一个空行。

vi /etc/pptpd.conf

修改 net.ipv4.ip_forward 为 1:

vi /etc/sysctl.conf

生效配置,启动防火墙服务:

/sbin/sysctl -p
/sbin/service iptables start

根据网卡参数配置防火墙。由于我的 VPS 有两个公网 IP,就这样:

/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -j SNAT --to-source xx.xx.xx.xx
/sbin/iptables -t nat -A POSTROUTING -o eth1:1 -s 192.168.0.0/24 -j SNAT --to-source x.x.x.x

保存设置,重启服务:

/etc/init.d/iptables save
/sbin/service iptables restart

最后重启 pptpd 就大功告成了:

service pptpd restart

还可以设置开机启动:

chkconfig pptpd on
chkconfig iptables on

参考文章《centos6.4安装搭建pptp vpn服务(附pptp vpn 一键安装包) | 大步's Blog》,原文作者:大步。原链接已失效。

从今天开始,妈妈再也不用担心我的学习。家中小米路由以及单位极路由完美适配。其中极路由本身有智能路由模式,小米路由需要刷开发包,开启 SSH。具体可参见《正确姿势使用智能VPN分流,无缝国内外分流科学上网》。

阅读剩余部分...

本博“被”通过 GFW 质量体系认证

作者:wiLdGoose 发布时间:2012 年 10 月 11 日 分类:生活 Lifestyle 10 条评论

这次,我只想说:Fuck GFW!

中共执政的 63 年,是走有“中国特色”封建集权制道路的 63 年、愚国愚民的 63 年。你们千万不要得意忘形,以为自己有多伟大的政绩,又不辱毛爷爷的使命,把维稳工作做得滴水不漏。在我眼里,你们就是跳梁小丑。不要以为你们在全国范围内投放播出了一部长达几十年的电视连续剧《新闻联播》,就真的可以遮天蔽日、为所欲为,就真的以为老百姓会相信你们在戏里表演的那样:领导都很忙,鞠躬尽瘁死而后已、社会主义中国日益繁荣富强、资本主义人民却生活在水深火热之中。不要把全体人民都当作傻瓜,你们的拙劣演技我们是有目共睹的。

我不得不承认,你们以前是土匪军,现在是执政党,煽颠的能力还是不错的。这从最近钓鱼小岛这场戏就可以看出,也许你们有时候真的可以用你们的喉舌控制媒体的声音、忽悠一些不明真相的群众、转移公众的视线。但是纸永远包不住火,连小柯南都知道,真相只有一个。

远的就不说了。除此之外,你们还禁锢进步思想,大搞互联网审查制度、干涉网民正常上网,居然大言不惭地说中国的互联网是最开放的。能将掩耳盗铃发挥到此般极致,我深深地佩服你们的勇气。你们可以不要脸、可以自甘堕落,但是逆潮流而动、违背社会发展的客观规律、抵制基本普世价值、无视人权,你们就一定能成为民族的千古罪人。加油,让我们拭目以待。

回到文章主题,说说本博是如何一步一步取得“被认证”的荣誉的。

一开始本博还在天朝生根发芽,突然全国范围推行备案政策,我就开始着手搬家。后来天朝的相关政策一直不见正常,甚至出现了“白名单”传闻,于是我在 Godaddy 买了主机和固定 IP,确定永久“移民”了。

随后一段时间,国内访问本博除了速度慢之外其他也都正常。但是好景不长,Google 事件发生后,Google 中国域名迁至香港。那时我发现国内访问国外的网站开始时断时续了,后来甚至有人总结出天朝当局封锁基于 HTTPS 协议的 Google 服务的时间段规律。

接着我发现 Godaddy 的 DNS 在国内也开始不正常,本博的访问也出现了类似于这种规律的周期性抽风。于是我又申请了 SSL 证书,并启用强制性 HTTPS 跳转,稍有成效。

今年国庆节期间,监控报告显示本博在全国大部分地区开始全时段的无法访问。我的小心脏紧张了一下,并意识到这次是来真的了。果然,经过技术测试已证实本博 xuchao.org 与 xuchao.net 在全国大部分地区 ISP 的 DNS 中被屏蔽解析,feed 订阅地址 feed.xuchao.org 也随之只能翻墙打开,导致使用诸如 Google Reader 等订阅器的同学以为我很久没更新博客了。其中 xuchao.org 尤为悲惨,连 MX 记录也不给我放过,直接导致我现在接收或者发送国内运营商的邮件,会有很长很长时间的延迟甚至退信。相对于这两个域名,xuchao.cn 等几个国内域名和中文域名幸免于难。

突然想起前几天这位同学的评论,应该也与这事有关系。

放图说明:

在整个测试过程中,我要感谢 blankyao水总明城、郭丹、磁力等同学先后给予无私的协助与关怀。

解决方案:

既然是 DNS 屏蔽,我们可以通过 8.8.8.8 或者本地 hosts 文件的方式来解决。如果您不知道我在说什么,请到 CCAV 等娱乐频道自学。谢谢。

最后,feed 的问题我将在近期解决,初步计划迁移到 feedburner。敬请期待。

记轩辕同学低调的婚礼

作者:wiLdGoose 发布时间:2012 年 10 月 8 日 分类:摄影 Photography 6 条评论

不得不承认,今年身边好多朋友结婚。刚喝完这场喜酒,又要准备参加下一场婚礼。不知是否与“末日论”有关,但这总是好事,大家都很识相地服老了。

我这里有份名单。

上半年参加了钟建东、蒋锋两位同学的婚礼,上个月底又参加了轩辕同学在湖州举办的婚礼,接下来还要依次接受张宇杰、吕峰军陆飞燕等同学的邀请。除此之外,还有父母辈亲戚的孩子(简称“超远房亲戚”)的婚礼。也有因故遗憾没到场的,譬如之前的无风同学、彭兄等。

这段时间安排参加婚礼,总之一个字,忙,几乎快占据了大部分的周末时间。根据我的观察与分析,这个趋势如同抛物线的轨迹一样,将在今年圣诞节、元旦与春节前夕期间(假设没有“末日”的话)达到高潮。对于我所拍摄过的婚礼现场,也都将统一在这里记录。

回到文章标题,轩辕同学已在上个月 29 日在湖州与爱妻黄小姐完婚。正是因为我与轩辕同学非同一般的关系,对于这场婚礼的拍摄工作我也格外重视与在意。无奈的是,轩辕同学与其爱妻行事都非常低调,不愿在公开网站露面,甚至拒绝了我为照片打马赛克的提议。这不得不说是巨大的遗憾。值得庆幸的是,还有几张写生片子可以凑合看,其中也有这对新人的身影——虽然未露脸。

砖头在哪里?

阅读剩余部分...

图像思维·儿童接受教育的重点途径和胎教的误区

作者:wiLdGoose 发布时间:2012 年 7 月 29 日 分类:观点 ViewPoint 2 条评论

本文(书)作者刘善永先生,在本网站(博客)以连载形式发布,未经授权不得转载、演绎或进行任何形式的商业应用。


上一篇:图像思维·中国近代科学水平落后的原因
本文(书)目录:猛击此处


人的智能思维是客观实景图像思维,所以不应把幼儿少年过早过多引入书本的学习中。文字和语言是人们交流思想的客观实景图像特征代码、字与客观实景图像相等、音与客观实景图像相等、字和音相等。一个人对另一个人表达自己记忆的客观实景图像即思想时,另一个人把听到的语言在脑组织中飞快地转换成特征图像来理解。当一个人写出或说出自己曾看过的一座小山时,“小山”一词在读者或听着脑思维组织中,根据自己曾看过的“小山”特征图像来理解,而不是作者或说者的“小山”原本模样,即不是作者或说者表达的客观实景图像。因而产生偏离实际的差距,甚至可能出现错误,只有实践经验丰富的人,才会更正确一些理解书本文字的实际图像意义。如果孩子读书过早过多,头脑记忆了一大堆自己理解的文字特征图像,成为知识积累,其中必定包含一大堆面和错误错误理解。他会用这些积累的特征图像,来对照检验即时传入大脑的客观实景图像,评判实际对错,会产生总认为书本是对的,实践是错的思维,会产生拒不接受拒不研究现实的心理。太小的孩子,不会把唐诗较为现实的特征图像,读诗背诗如嚼蜡,会对思维和记忆图像产生混乱模糊影响,使智力不太清醒。

所以幼儿少年多注重实践的认识和学习室非常重要的。很小时候让孩子记忆走过的街道,记忆分辨物体不同的详细特征,记忆事物发展的连续过程,会促进脑思维图像清晰度提高。不要相信市场所谓益智药品会营养品夸大宣传,出品人根本不知道脑思维图像清晰度是智力根本差别的原因,因此他们的产品也不会对脑思维图像清晰度产生很强作用。增加有益于大脑组织营养品,只会消除脑思维疲劳,使思维精力充沛、达到本人智能较上佳状态,假品反而有害。真正的气功锻炼有促进脑部血液循环,有使思维精力充沛,达到本人智能上佳状态作用,但不会有使人智能突增超常作用。假气功没有好作用。到森林或树林茂盛空气清新的地方散步和放松身心活动,有消除脑疲劳,恢复思维精力充沛的作用。毛泽东时代提倡学生德智体全方面发展是非常正确的。德不好会危害社会和家庭。没有好的智力,工作没有方向,无法取得成就。没有发达的四肢和体魄,智力就没有载体而无法存在。头脑聪明、四肢发达,你将是一个超人。同理儿童不能过度上网。

西方对人脑智能研究处在盲人摸象阶段,因此走入胎教的误区。人的思维或思想依靠客观实景图像来进行的,头脑中思维图像不能遗传,思想就不能遗传。胎儿在腹中一片黑暗,脑组织中不会有一点客观世界图像。你非要进行胎教就得用语言、胎儿在腹中不会把语言理解为客观实景特征图像,因此无法接受教育。胎儿接受胎教时可能是汉语、也可能是英语、俄语、法语、这就要求胎儿懂全世界的语言。事实是婴儿出生后,需要几年的学习才能逐步掌握母语。真正优生优育应为孕前孕后夫妻和睦、生活快乐、努力工作、积极钻研学习、注重营养、注重锻炼,使身体多产生一些健康聪明的物质给胎儿,为孩子的后天打下一个更好的基础。同理,对别人的思维侦测和探知极难,只能探知情绪,而无法探知思维图像。

  1. 1
  2. 2
  3. 3
  4. 4
  5. ...
  6. 39