网站如果有很多用户上传图片(相册,商品图片),一般的做法是将用户图片保存在磁盘上面(数据库中记录图片的地址)。用户上传的时候按照原图、中图、小图等各个尺寸都生成一份保存在磁盘上。比如php的网店系统echsop就是这么做的,而shopex之类也大同小异。

这种做法也不是不可以。多生成几个尺寸,在磁盘上无非多存储几份而已,磁盘现在也便宜。

不过,有个问题:运营部经常需要很多尺寸版本的图片,比如需要80*80,又需要70*80,各个版面随着活动的需要,尺寸往往不同。有些一张图片可能需要根据不同的应用场景提供的图片尺寸不同,假设统计一下有几十种不同尺寸的缩略图。难道生成20张保存在磁盘上?磁盘价格固然白菜价。但是要考虑大量图片请求导致的磁盘读写的性能问题。

后来发现,随着流量大,尤其并发访问大,图片非常多的时候,频繁的读写,图片存储在磁盘上,磁盘磁头频繁定位造成的延时。

后面我了解到,业界比较成熟的做法是实时生成缩略图。也就是传递尺寸,当时就生成(生成也可以保存在磁盘上,以备下回需要的时候继续使用,也可以不保存,自己控制),这样子在磁盘上就不用保存很多份了。

看过淘宝网对自己图片存储的介绍:http://news.cnblogs.com/n/73189/

了解到如下关键点:

淘宝网的图片文件数量达到286亿多个,这些图片文件包括根据原图生成的缩略图。平均图片大小是17.45K;8K以下图片占图片数总量的61%,占存储容量的11%。

 这就给淘宝网的系统带来了一个巨大的挑战,众所周知,对于大多数系统来说,最头疼的就是大规模的小文件存储与读取,因为磁头需要频繁的寻道和换道,因此在读取上容易带来较长的延时。在大量高并发访问量的情况下,简直就是系统的噩梦。

 

实时生成缩略图的好处总结如下:

1、节省存储空间。虽然现在磁盘确实很便宜。1g的成本很低。但是毕竟还是需要钱的。更关键一点是,图片保存在磁盘上读取时磁头频繁定位的性能问题(服务器实时生成消耗的应该是cpu资源,cpu速度很快)

图片越多时,问题越大。

2、更加灵活响应运营部的多尺寸图片需求。比如有些一张图片可能需要根据不同的应用场景提供的图片尺寸不同,假设统计一下有几十种不同尺寸的缩略图。难道生成20张保存在磁盘上?

程序员确实不用纠结保存多少份的问题了。

有些图片尺寸,只会用到一次,比如做活动使用一次,后面可能永远都不会被用到。没必要在上传图片的时候消耗cpu资源去生成,浪费磁盘空间去存储

还是一样,图片种类越多,这个问题越明显。图片就那么点点就没问题(比如就是存储用户头像而已,而商品图片就会用到很多尺寸的版本)

淘宝网提到了他们使用GraphicsMagick进行图片处理。

 

搜索到的资料如下

1、ImageMagickImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件

利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。

功能如下:

1. 将图片从一个格式转换到另一个格式,包括直接转换成图标。

2. 改变尺寸、旋转、锐化(sharpen)、减色、图片特效

3. 缩略图片的合成图( a montage of image thumbnails)

4. 适于web的背景透明的图片

5. 将一组图片作成gif动画,直接convert

6. 将几张图片作成一张组合图片,montage

7. 在一个图片上写字或画图形,带文字阴影和边框渲染。

8. 给图片加边框或框架

9. 取得一些图片的特性信息

2、  GraphicsMagick

GraphicsMagick 支持大图片的处理,并且已经做过GB级别的图像处理实验。GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面

也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用。事实上,GraphicsMagick是从 ImageMagick 5.5.2 分支出来的,但是现在他变得更稳定和优秀,下面就是两个之间的一些比较。

GM更有效率(测评),能更快的完成处理工作

GM更小更容易安装

GM已经被Flickr和Etsy使用,每天处理百万计的图片

GM与已经安装的软件不会发生冲突

GM几乎没有安全问题

GM的手册非常丰富

使用GraphicsMagick常见的做法是:单独一台图片服务器用来响应生成缩略图的请求。nginx+GraphicsMagick+lua结合起来。图片服务器上安装nginx,nginx调用lua程序,让lua程序来执行shell命令(GraphicsMagick原本就是可以通过shell命令来调用的,这里就是让lua来调用),大体像下面这样子:

location ~ '/images/([0-9a-z]+)_([0-9]+)x([0-9]+).jpg$' {

root /home/images;

set $image_root =  '/home/images';

set $fileName = ngx.arg[1];

set $width = ngx.arg[2];

set $height = ngx.arg[3];

set $origin = $image_root/$fileName.jpg

set $file = $image_root/$fileName_$widthx$height.jpg

#请求的图片尺寸不存在 ,就实时生成,并且保存一份到磁盘上备下回使用

if (!-f $file) {

rewrite_by_lua '

local command = "gm convert "..ngx.var.origin.." -thumbnail "..ngx.var.width.."x"

..ngx.var.height.." "..ngx.var.file;

os.execute(command);

';

# rewrite_by_lua右边的单引号里面是lua程序语法。里面关键就是os.execute执行一条命令。这条命令就是调用GraphicsMagick

}

 

 

这里有篇好文章,专门分析亚马逊是如何保存图片的(其实也是实时生成缩略图的方式):

http://aaugh.com/imageabuse.html

不过是纯英文的。

其实大部分网站通过实时生成图片应该能够满足需求了。达到淘宝那样子需要研发自己的cdn图片网络环境,很少公司达到。

有个理论性的东西比较重要:

对数据库的读/写的速度永远都赶不上文件系统处理的速度。所以把图片文件丢到磁盘上让文件系统来维护比较好。只是磁盘频繁的定位造成的速度慢又是一个问题,呵呵。不过,只是并发访问量大的时候才会出现。没到极限不必担心,避免过度设计。

我写这篇文章,就是预留以后遇到这种问题,备个解决方案。

15年更新:

恰好进入的一家公司,图片存储占用的磁盘空间大。有几十个t,针对图片还要进行备份。同一张图片分为不同的尺寸。这样占据的空间比较麻烦。

基于存储成本考虑。使用动态生成图片尺寸的方式。

一张图片如果有多个尺寸。不保持多个尺寸,需要什么尺寸就实时生成。图片让七牛存储去生成?
硬盘就保存原图。如果需要a尺寸,b尺寸。传递参数,当时生成一个返回,硬盘不保存多个尺寸的图。

使用了第三方的图片存储,没有自己搭建服务来生成尺寸。之所以使用第三方,因为他们有cdn加速服务,图片可以就近节点存储,用户访问可以就近节点进行访问图片。

目前的硬盘24t。快占满了。

转载于:https://www.cnblogs.com/wangtao_20/p/3481098.html

业界对生成图片缩略图的做法归纳相关推荐

  1. java 图片处理 图片缩略图,java怎么生成图片缩略图,缩小图片,高清图片缩小

    java如何生成图片缩略图,缩小图片,高清图片缩小 可以把图片缩小到理想的倍数,也可以根据自己的需要来具体规定图片转化后的大小 对于类型为jpg的图片来说,只需要三个参数就能转化得到自己想要的图片 参 ...

  2. php图片生成缩略图_PHP生成图片缩略图类示例

    本文实例讲述了PHP生成图片缩略图类.分享给大家供大家参考,具体如下: class App_image_helper { protected $imgFileName; protected $imgW ...

  3. php图片生成缩略图_PHP实现生成图片缩略图函数

    本文主要和大家介绍了PHP基于GD库实现的生成图片缩略图函数,涉及php针对图片属性相关操作技巧,需要的朋友可以参考下,希望能帮助到大家. /** * 生成缩略图函数(支持图片格式:gif.jpeg. ...

  4. php图片缩略图的方法,php生成图片缩略图的方法

    本文实例讲述了php生成图片缩略图的方法.分享给大家供大家参考.具体如下: 这里需要用到GD2 library function make_thumb($src,$dest,$desired_widt ...

  5. php 生成缩略图保存,PHP批量生成图片缩略图的方法

    //用PHP批量生成图片缩略图 function mkdirs($dirname,$mode=0777) //创建目录(目录, [模式]) { if(!is_dir($dirname)) { mkdi ...

  6. (转)PHP生成图片缩略图

    注:此功能依赖GD2图形库 最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图 试用了一下后,发现有这样几个问题: 1.png图片生成的缩略图是jpg格式的 2.png图片 ...

  7. IOS平台生成图片缩略图的两种方案

    2013-04-16 15:48 2574人阅读 评论(0) 收藏 举报 IOS平台生成图片缩略图的两种方案 只写出关键部分,其它部分自己添加既可 1.自动缩放到指定大小 + (UIImage *)t ...

  8. JAVA生成图片缩略图、JAVA截取图片局部内容

    目前,google已经有了更好的处理JAVA图片的工具,请搜索:Thumbnailator package com.ares.image.test;import java.awt.Color; imp ...

  9. php 缩略图生成类,php生成图片缩略图类

    /** * @abstract 生成图片的缩略图,可以指定任意尺寸,生成的图片为png格式 * @example * $file = 'test.png'; * $th =new Thumbnail( ...

最新文章

  1. 人工智能正在永远改变药理学
  2. 千难万险 —— goroutine 从生到死(六)
  3. 关于华硕主板“USB Devices Over Current Status Detected!”
  4. sql server使用杂记
  5. [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组]
  6. python什么是空类型_在Python中创建真正的空类型
  7. pytest+allure之测试报告本地运行
  8. 一加8 Pro渲染图曝光:骁龙865+挖孔屏+后置四摄
  9. APPCAN学习笔记005---AppCan IDE安装下载,AppCan IDE启动
  10. python装饰器详解-如何理解Python装饰器?
  11. 创业公司专题数据(包含stata多种模型代码)
  12. 计算机基础知识教程excel试题,大学生计算机基础excel试题及答案
  13. 电音中DJ/Producer/MC/EDM/Remix/Mix的名词解释(转)
  14. maven配置阿里镜像
  15. 每周论文精读01——3D Human Pose Estimation with 2D Marginal Heatmaps
  16. 武大三行情书第一名---《螃蟹在剥我的壳》
  17. 语音交友app开发中的用户积分系统
  18. ubuntu 14.04 搜狗拼音安装
  19. Android 自定义相机Demo源码
  20. java 地铁费_通过java程序模拟实现地铁票价2+2=12

热门文章

  1. centos查看历史指令记录_CentOS 系统通过 curlftpfs 挂载 FTP 服务器为本地磁盘
  2. lammps软件_MAPS软件:让LAMMPS运用更高效 — 特点及实例
  3. 【java】兴唐第二十九节课作业
  4. 【java】兴唐课程第五节到第九节知识点总结
  5. Angular 组件交互
  6. 两分钟让你知道什么是“Java重载”
  7. 微信小程序打开预览下载的文件
  8. iOS 模仿支付宝支付到账推送,播报钱数
  9. WSS 代码执行的权限提升
  10. 北京智能计算产业研究院落户顺义,中科睿芯联手计算所、顺义区打造“产业园2.0”...