Nginx+PHP实时生成不同尺寸图片

原来图片服务器采用Windows .net架构,鉴于需求需要生成各种尺寸图片。

流程说明:

用户从Nginx请求对应的图片,判断是否存在_200x300的对应参数,如果没有就直接请求到对应目录的原图,否则继续判断是否在本地已经生成了对应的缓存图片,如果存在返回已经生成过的定制尺寸图片,否则请求PHP动态生成。

Nginx部分配置:

    server {
        listen       80;
        server_name  pics.abc.com;
        location / {
            root   /var/www/html;
            index  index.html index.htm index.php;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ \_(\d+)x(\d+)\.(jpg|png|gif|jpeg|bmp)$ {  //判断是否定制图
                try_files $uri /temp/$uri /get.php;    //判断是否已生成过定制图否则转交给/get.php
                expires      30d;
        }

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp)$
        {
                expires      30d;
        }

        }
    }

在/var/www/html我们以只读方式挂载Windows的目录,修改/etc/fstab,添加

\\192.168.2.3\f$\pics.abc.com\pics /var/www/html/pics/ cifs    ro,username=user,password=pass   1  2

然后重启netfs服务,另外执行下面命令,安装依赖的包

yum -y install samba-client cifs-utils
service netfs restart
chkconfig netfs on

生成的缩率图会放到网站目录的temp目录下,如请求的http://pics.abc.com/pics/201604/29/abc_200x300.jpg

则生成的图片放在temp/pics/201604/29/abc_200x300.jpg目录下

PHP脚本:

function thumb($src, $width, $height, $filename, $mode = ‘scale‘, $quality = ‘100‘) {
try {
        $imageValue = getimagesize($src);
        $sourceWidth = $imageValue[0]; //原图宽
        $sourceHeight = $imageValue[1]; //原图高
        $thumbWidth = $width; //缩略图宽
        $thumbHeight = $height; //缩略图高
        $_x = 0;
        $_y = 0;
        $w = $sourceWidth;
        $h = $sourceHeight;
        if ($mode == ‘scale‘) {
                if ($sourceWidth <= $thumbWidth && $sourceHeight <= $thumbHeight) {
                        $_x = floor(($thumbWidth - $sourceWidth) / 2);
                        $_y = floor(($thumbHeight - $sourceHeight) / 2);
                        $thumbWidth = $sourceWidth;
                        $thumbHeight = $sourceHeight;
                } else {
                        if ($thumbHeight * $sourceWidth > $thumbWidth * $sourceHeight) {
                                $thumbHeight = floor($sourceHeight * $width / $sourceWidth);
                                $_y = floor(($height - $thumbHeight) / 2);
                        } else {
                                $thumbWidth = floor($sourceWidth * $height / $sourceHeight);
                                $_x = floor(($width - $thumbWidth) / 2);
                        }
                }
        } else if ($mode == ‘crop‘) {
                if ($sourceHeight < $thumbHeight) { //如果原图尺寸小于当前尺寸 
                $thumbWidth = floor($thumbWidth * $sourceHeight / $thumbHeight);
                $thumbHeight = $sourceHeight;
                }
                if ($sourceWidth < $thumbWidth) {
                        $thumbHeight = floor($thumbHeight * $sourceWidth / $thumbWidth);
                        $thumbWidth = $sourceWidth;
                }

                $s1 = $sourceWidth / $sourceHeight; //原图比例
                $s2 = $width / $height; //新图比例
                if ($s1 == $s2) {
                } else if ($s1 > $s2) { //全高度 
                        $y = 0;
                        $ax = floor($sourceWidth * ($thumbHeight / $sourceHeight));
                        $x = ($ax - $thumbWidth) / 2;
                        $w = $thumbWidth / ($thumbHeight / $sourceHeight);

                } else { //全宽度 
                        $x = 0;
                        $ay = floor($sourceHeight * ($thumbWidth / $sourceWidth)); //模拟原图比例高度
                        $y = ($ay - $thumbHeight) / 2;
                        $h = $thumbHeight / ($thumbWidth / $sourceWidth);
                }

        }
        switch ($imageValue[2]) {
                case 2: $source = imagecreatefromjpeg($src);
                        break;
                case 1: $source = imagecreatefromgif($src);
                        break;
                case 3: $source = imagecreatefrompng($src);
                        break;
                case 6: $source = imagecreatefromwbmp($src);
                        break;
                default: defulat();
                return;
        }
        header("Content-type: image/jpeg");
        $thumb = imagecreatetruecolor($width, $height);
        imagefill($thumb, 0, 0, imagecolorallocate($thumb, 255, 255, 255));
        imagecopyresampled($thumb, $source, 0, 0, $x, $y, $width, $height, $w, $h);
        imagejpeg($thumb, null, $quality);
        imagejpeg($thumb, $filename, $quality);
        imagedestroy($thumb);
        imagedestroy($source);
} catch (Exception $ex) {
        defulat();
 }
}

function defulat() {
/*
        $default_img = realpath(‘../pictures/nopic.gif‘);
        ob_start();
        header(‘Content-type:image/jpeg‘);
        readfile($default_img);
        ob_flush();
        flush();
*/
echo ‘error‘;
}

function mkDirs($dir){
    if(!is_dir($dir)){
        if(!mkDirs(dirname($dir))){
            return false;
        }
        if(!mkdir($dir,0755)){
            return false;
        }
    }
    return true;
}

$uri=$_SERVER[‘REQUEST_URI‘];
$image=basename($uri);

$temp=‘./temp/‘.dirname($uri).‘/‘;
$imgpath=‘.‘.dirname($uri).‘/‘;

/*
//检查本地是否存在文件,原图
if(file_exists($temp.$image)){
        ob_start();
        header(‘Content-type:image/jpeg‘);
        readfile($temp.$image);
        ob_flush();
        flush();
        exit();
}
*/

//检查生成的图片是否曾经生成过,存在即返回,否则重新生成新图
if(!preg_match(‘/_(\d+)x(\d+)/‘, $image, $wh)){
        ob_start();
        header(‘Content-type:image/jpeg‘);
        readfile($imgpath.$image);
        ob_flush();
        flush();
        exit();
}

$width = $wh[1];
$height = $wh[2];
$source_img=preg_replace(‘/_(\d+)x(\d+)/‘, ‘‘, $image);
//对长宽都超过的图片返回原图
if($width>=2000 || $height>=2000){
	ob_start();
        header(‘Content-type:image/jpeg‘);
        readfile($imgpath.$source_img);
        ob_flush();
        flush();
        exit();
}

//图片处理
$src=$imgpath.$source_img;
$filename=$temp.$image;
mkDirs($temp);
//thumb(realpath($src), $width, $height, $filename, ‘crop‘, ‘85‘);
thumb(realpath($src), $width, $height, $filename, ‘crop‘, ‘100‘);

PHP生成尺寸部分参考<PHP图片自动裁切应付不同尺寸的显示>

时间: 2024-10-25 12:46:11

Nginx+PHP实时生成不同尺寸图片的相关文章

nginx实时生成缩略图到硬盘上

原文:http://www.ttlsa.com/nginx/nginx-create-image-on-disk/ 现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + lua实现的,上节我也讲到了使用nginx生成缩略图,但是用户每次访问都需要生成一次,会给cpu和硬盘带来比较大的压力,今天带来了另外一种方式,这次使用nginx将原图生成缩略图到硬

nginx实时生成缩略图存储到硬盘上

现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + lua实现的,上节我也讲到了使用nginx生成缩略图,但是用户每次访问都需要生成一次,会给cpu和硬盘带来比较大的压力,今天带来了另外一种方式,这次使用nginx将原图生成缩略图到硬盘上.看我的配置 1.首先创建好cache目录 [[email protected] ~]# mkdir -p /d

nginx+lua+GraphicsMagick生成实时缩略图-CentOS7

背景 大多数的系统都会涉及缩略图的处理,比如新闻系统和电商系统,特别是电商系统,每个商品大图都会对应一系列尺寸的缩略图用于不同业务场景的使用.部分系统也会生成不同尺寸的缩略图以供PC.手机端.ipad端使用. 解决方案探索: 直接加载原图,使用css样式表来控制图片的宽高.显然不太合适,大家也尽量不要这样做. web程序在上传成功后,同时生成相应缩略图.这种做法效率较低,如果遇到批量导入的业务时严重影响性能.并且同步生成缩略图会占用一定量的存储空间,如果能按需生成岂不更好? 使用七牛.阿里云提供

Asp.net mvc 实时生成缩率图到硬盘

之前对于缩率图的处理是在图片上传到服务器之后,同步生成两张不同尺寸的缩率供前端调用,刚开始还能满足需求,慢慢的随着前端展示的多样化,缩率图已不能前端展示的需求,所以考虑做一个实时生成图片缩率图服务. 每次调用实时生成缩率图,不缓存着实有点浪费,所以在生成缩率的同时缓存到硬盘一份,效率提高很多. 之前从网上看了一下有人用nginx + lua实现的,效率那是没什么可说的,但是时间紧迫,自己也没时间去研究,所以暂时先用aps.net mvc4来实现 一个,以后有时间了,再慢慢修改. 用自己熟悉的.n

nginx使用image_filter生成缩略图 -- fasdfs海量图片缩略图整合

1 http_image_filter_module http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息. 1.1 查看有没有安装 # /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.5.0 built by gcc 4.4

C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码

本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边边框.有需要的朋友们可以试一下,如有bug欢迎指正. 首先,将 ThoughtWorks.QRCode.dll 放在 bin 目录后,在页面中引用: using ThoughtWorks.QRCode.Codec; 生成二维码图片: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

ionic生成全尺寸icon和splash

http://www.jianshu.com/p/eda363eb28d3 1. icon 提供1024*1024的icon.png图片, 放到根目录下的resources目录下, 执行命令就能生成各个尺寸的图片了 ionic cordova resources --ionic 2. splash 先安装插件 $ ionic cordova plugin add cordova-plugin-splashscreen 同样的提供2732*2732的splash.png图片, 执行命名 ionic

AutoCAD.Net/C#.Net QQ群:193522571 previewicon生成的块图标太小,CMLContentSearchPreviews生成大的图片

由于CMLContentSearchPreviews方法是AutoCAD2014中才加入的,所以只能应用于2014及以后版本,可惜啊! using System.IO; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; using Autode

PHP 简易读取文件目录下的文件,生成css spirte图片

因为个人不是对PS熟悉,不清楚如何在PS中生成一张横向有序的spirte图片,使用了"css sprite V4.3"版本,生成的图片会出现压缩图片大小的情况,本想修改原作者开发的程序,但是不懂C#,只好使用PHP gd库进行生成css spirte图片. 1 <?php 2 header("Content-type: image/png"); 3 $path = "output";//建议这个文件目录下放入所有需要生成css spirte