现在为了使用不同宽高的图片,做了个动态生成的程序。每次根据图片传入的宽高来输出图片,然后 html 页面里用
<img src="xxx.com/img?src=c8d997dae152b2bfdfd0a48a6142ec_900_400.jpg" />
这个就是 900X400 的。
用也就是 php 的 GD 库来创建个图层,来根据比例重新画出一个图
imagecreatetruecolor($_n_w,$_n_h);
imagecopyresampled($this->new,$this->img,0,0,$_cut_width,$_cut_height,$new_width,$new_height,$this->width,$this->height);
最后输出图片让 html 引用 这个地址就行了
header("Content-type: image/png");
imagepng($imgsrc);
现在问题是 html 引用了后,好多图片会出现一半,或者不出来了,效率太低了,有什么改进办法没?
10 个回答
答案对人有帮助,有参考价值1答案没帮助,是错误的答案,答非所问
bf 5.2k 2014年12月31日 回答 · 1月4日 更新
樓下那些重複我的答案卻不點讚的幾個意思 ╮( ̄﹏ ̄)╭
首先,放棄 GD,改用 imagick。 \( ̄- ̄)/
其次,緩存。
最簡單的緩存設計:
url 爲 cache/image0001-1024x768.jpg
如果服務器找不到,則交給 PHP 處理,生成的結果保存,下一次就和靜態資源沒甚區別了。 (○′ω`○)
再次,實際使用時完全沒有必要把各種大小都用上,固定用幾個就行了,後端的強大是爲了前端的方便而不是偷懶 ( ̄ˇ ̄)
比如 wikipedia 雖然支持任意縮放,但一般情況顯示的都是幾個固定大小,所以基本上也不會出現重複運算。╮( ̄▽ ̄)╭
答案对人有帮助,有参考价值1答案没帮助,是错误的答案,答非所问
肖大侠 171 1月4日 回答
直接用 CDN 服务商的自动缩略图工具吧,好像 upyun 和 qiniu 都有这种接口的。
不然的话,就使用 ImageMagick 库,比 GD 快不知道多少倍。
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
murmur 609 2014年12月31日 回答
这个设计本身就是错误的,比较科学的设计是实现计划好所有的可能,然后选几个分界点,在图片上传的同时,生成比如4-5个尺寸的图片,每次就是纯静态访问了
其余的尺寸就是用浏览器自身的缩放
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
hiro0729 71 2014年12月31日 回答
用js控制吧,去github上搜几个库用用就行
https://github.com/search?utf8=%E2%9C%93&q=img+fit
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
夜未央 105 1月1日 回答
和一楼观点相反,这不是错误的设计,这种更科学。就如楼上所说至少得加上缓存
另外附上一个图片缩略服务的项目https://github.com/thumbor/thumbor
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
不写代码的码农 5.2k 1月4日 回答
用imagick和ImageMagick库吧
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
Aries 167 1月4日 回答
1.使用ImageMagick
2.每次生成图片的时候判断这个尺寸的图片是否存在,不存在,再生成。。。然后保存(也就是缓存吧)
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
Yourtion 343 1月4日 回答
推荐直接使用CDN商,例如七牛,我自己就是用七牛的,定了一套规则,把资源目录给做成一个子域,然后镜像就解决问题,不需要整各种同步脚本。
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
qianfeng 137 1月4日 回答 · 1月4日 更新
有的cdn支持图片缩略图功能,
或者自己 rewrite 判断文件是否存在,不存在php处理完生成到相同路径。
比如: /thumb/12345_100x100.jpg
第一次用PHP处理生成到 /thumb/12345_100x100.jpg
,下次文件存在就直接返回了。
答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问
viphackl 20 1月5日 回答
PHP处理图片本来就耗服务器资源如果你一个页面有很多需要这种时时去处理的图片资源服务器能忙过来~~
就楼上所提的一样~~通过PHP程序或rewrite来判断该尺寸的图片是否已经存在,不存在处理。这样可以减轻服务器的压力应该会提升处理的速度吧。~