PHP 如何不损失图片质量的添加一个小水印,并且文件大小不会显著增加?

2015-01-16 16:00:35 +08:00
 DearTanker
有没有比较好的库或者方法推荐,现在用imagick,图片质量设置100,处理后的图片是原图的好几倍。。设置低了有肉眼可见的损耗。。
6443 次点击
所在节点    问与答
22 条回复
yyfearth
2015-01-16 16:03:17 +08:00
可以读取jpg文件的质量设置 然后根据每张图片自己的质量设置进行压缩 这样一般情况下图片不会变大太多 而且质量不会下降太多 但是不能保证
对于其他格式的文件 那么就95%左右压缩成jpg好了
DearTanker
2015-01-16 16:05:30 +08:00
@yyfearth 这也行?imagick可以做到吗,但是问题是设置100也会因为超过图片自己的质量设置而变模糊吗?
wowo2088
2015-01-16 16:06:42 +08:00
对于jpeg来讲,不损失图片质量那是不可能的,你需要考虑的是可以接受的质量损失程度
yyfearth
2015-01-16 16:10:06 +08:00
@DearTanker 我记得jpg图片一般会存储质量设置 可能有库可以读取吧
如果jpg文件之前已经用 < 100% 的设置压缩过 那么用100% 不会造成太大的损失
只要大小不变 不会变模糊 但是会有轻微的损失
其实一般情况下 95-98% 就基本上看不出来了

只是如果一个jpg已经是80%一下压缩 你用>90%从新压缩就比较浪费了
DearTanker
2015-01-16 16:13:34 +08:00
@yyfearth 是的,但是怎么读取啊。。

我刚看到一篇文章说,如果需要对一张jpg进行处理,要先把jpg转换成其他格式后进行处理,然后在最后一步保存出来,不知道这样做有没有道理。。
http://floss.zoomquiet.io/data/20130822153054/index.html
里面的“JPEG图像文件格式”

@wowo2088
wowo2088
2015-01-16 16:17:24 +08:00
使用 GD
$logoImage = ImageCreateFromPNG('logo.png'); // 装入 LOGO
$photoImage = ImageCreateFromJpeg($file_name); // 装入一幅图象, 准备加盖水印
ImageAlphaBlending($photoImage, true); // 设定图像的混色模式
ImageCopy($photoImage, $logoImage, 0, 0, 0, 0, 200, 80); // 拷贝LOGO到图像中
ImageJPEG($photoImage,$out_file,70); // 以 JPEG 格式将图像输出到浏览器或文件,70是图片质量
ImageDestroy($photoImage); // 消除占用的资源
ImageDestroy($logoImage);
DearTanker
2015-01-16 16:20:55 +08:00
@wowo2088 GD的效果会更好吗?
DearTanker
2015-01-16 16:22:35 +08:00
正在尝试 「原图jpg=》(伪原图png+水印)*质量=》水印图jpg」这个处理过程。。
wowo2088
2015-01-16 16:22:50 +08:00
@DearTanker GD 和 imagick 没比较过,我只用 GD ~ 呵呵
jevonszmx
2015-01-16 16:57:26 +08:00
imagick 可以读取原压缩质量的
linux命令是:identify -verbose 1.jpg,可以grep 'Quality'看结果;
php扩展后命令是:getimagecompressionquality;

注意:
生成目标图片的质量是:

(水印后的图质量比)* 要生成的图片质量比 / 100

<?php
$quality = 80;
$img->getimagecompressionquality() * $quality / 100;
$img->setimagecompressionquality($quality);
?>
dingyaguang117
2015-01-16 17:09:40 +08:00
原来都不是100% 现在100% 是会变大的
DearTanker
2015-01-16 17:43:01 +08:00
@jevonszmx PHP读取原压缩质量的命令是啥呢?
DearTanker
2015-01-16 17:52:34 +08:00
@jevonszmx 、不好意思,你说的就是了= =囧。。。试试看~
DearTanker
2015-01-16 17:57:29 +08:00
@dingyaguang117 是的。
DearTanker
2015-01-16 17:58:44 +08:00
@jevonszmx
@yyfearth

对了,如果按照原图的压缩质量重新压缩,比如原图80%,输出也80%,中间不做任何处理,那损失会大吗?ヾ(´・ ・`。)ノ"
BGLL
2015-01-16 18:04:53 +08:00
jpeg 用了不可逆的算法 解码后再次编码一定会损失质量
质量优先就得转成其他无损格式比如 png 别再转成 jpeg 了
DearTanker
2015-01-16 18:06:40 +08:00
@BGLL 有道理的,等测试结果。
explon
2015-01-16 18:07:24 +08:00
转成 PNG 加完水印然后调用 pngquant 压缩一下,就是原质量
bjzhush
2015-01-16 21:05:50 +08:00
你也可以考虑调用其它的语言及库来做这个事,如果PHP没有合适的方法的话,比如py
走file或者url都可以考虑,搭建一个服务
DearTanker
2015-01-16 21:46:53 +08:00
@explon 谢谢。不过用其他语言不现实,公司的东西

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/162738

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX