php 动态输出图片尺寸,高并发下 php 输出图像对性能开销大不大?

这篇博客介绍了如何利用PHP处理JPG图片,通过存储渐进式格式并采用串流输出的方式,减少服务器带宽消耗。在输出时,根据需要调整图片大小,通过截断文件流实现低分辨率显示,同时保持较高清晰度。此外,还讨论了JPEG格式的段落结构和优化技巧,以及如何通过JavaScript下载语法提供完整图片供用户下载,以解决图片质量下降的问题。
摘要由CSDN通过智能技术生成

8

2016-12-31 00:58:23 +08:00   b7048e5c0150a989fed46971f5ac1886.png 3

如果是 JPG 就可以用贱招.

首先你只要存原始尺寸图片.但一定要是 JPG 渐进式格式.存档品质不要超过 85 比较好.这个 php 本身就有支援.

然后重点.输出的时候用串流输出. 意思就是 php 读取图片用串流(BYTE)的.不要解读图片

然后 php 控制输出也是串流的.但输出多少要自己控制.

例如你只要 4 分之 1 的大小=长宽减半的大小.

你就先取得整个档案的大小.计算 4 分之一的档案长度.

然后串流输出的时候.到达 4 分之 1 的输出后.直接截断.关闭串流.

用户端需要稍微用 html 控制一下.直接指定显示的长宽.

因为实际上你输出的还是原始尺寸.

而对方收到的图片清晰度却没有达到全部.但一定超过 4 分之一的需求.

所以看不出有问题.但计算消耗只有第一次的存档.输出频宽消耗也只有 4 分之 1.

验证方法是随便产出一些 渐进式品质 75~85 的 JPG 图片.直接用档案切割软体或是 16 进制的编辑软体截断档案.

然后将截断的前面用看图软体打开.

用 4 分之一大小看基本上没问题.但用原始尺寸看就可以看到破损.

有研究 JPEG 格式就知道.渐进式的话.他有一个一个的段落.每个段落都会让图片慢慢清晰.而且后面的不存在也没关系.只是解码会终止.但可以正常显示前面.

如果有搭配 imagemagick 或类似的软体存档.可以给他更多参数.

例如黑白灰(YUV 的亮度 Y)正确性比彩色(UV 部分)重要.下参数让 Y 全部在前然后才是 UV.

他就会变成 YYYYUUUUVVVV(第一层.最模糊) YYYYUUUUVVVV (第 2 层某一块.是第 1 层的局部补正) YYYYUUUUVVVV (第 2 层某一块.是第一层的局部补正) YYYYUUUUVVVV (第 3 层某一块.是第 2 层的局部补正) YYYYUUUUVVVV (第 3 层某一块.是第 2 层的局部补正) .....直到最后一层.

如过颜色比较重要那就下参数让 YUV 混合.就变成 YUVYUVYUVYUV(第 1 层) YUVYUVYUVYUVYUVYUVYUVYUV(第 2 层)....以此类推.

每一层有几块是编码器决定的.而且还分算数二进算法或是金字塔算法.所以不好计算你要的尺寸要切到哪一层.干脆直接截断.

金字塔算法是预设的因为效率更高但较复杂难预测. 算数二进比较简单.可预测但档案较大.

以上就是不换设备但有高解析度到低解析度需求的解决方案.

缺点是用户很喜欢你的图片存下来看原图他会翻白眼.因为截断的瑕疵就会露出来.

这里的补充解法是. 图片旁边写 JS 下载语法.

参考范例(繁)

http://www.ladesign.tw/paper/info/jquery_html2canvas_download

他是按照标签产图.你就选图片的那个标签名称就可以.他会产生"用户看见"的大小的图片.

等于是用户浏览器自己重新编码一个图片了.大小比用户看见的小一些(我也不懂原因哈哈哈).

但是不会有破图瑕疵.

以上是我的自建图床解.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值