8
2016-12-31 00:58:23 +08:00 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
他是按照标签产图.你就选图片的那个标签名称就可以.他会产生"用户看见"的大小的图片.
等于是用户浏览器自己重新编码一个图片了.大小比用户看见的小一些(我也不懂原因哈哈哈).
但是不会有破图瑕疵.
以上是我的自建图床解.