在数据库里有完整的图片,每张大小都有2M左右,希望能生成大小不超过100K的缩略图。同时需要裁剪中间的一块输出,给一个左上角坐标和宽度高度,得到一张较小的图片。能实现吗?

解决方案 »

  1.   

    为你提供一个图片上传类吧<?php
    class UPImages {
            var $annexFolder = "annex";//附件存放点,默认为:annex
            var $smallFolder = "smallimg";//缩略图存放路径,注:必须是放在 $annexFolder下的子目录,默认为:smallimg
            var $Folder = "";//水印图片存放处
            var $upFileType = "jpg gif png";//上传的类型,默认为:jpg gif png rar zip
            var $upFileMax = 1024;//上传大小限制,单位是“KB”,默认为:1024KB
            var $fontType;//字体
            var $maxWidth = 500; //图片最大宽度 
            var $maxHeight = 600; //图片最大高度 
            function UPImages($annexFolder,$smallFolder,$includeFolder) {
                    $this->annexFolder = $annexFolder;
                    $this->smallFolder = $smallFolder;
                    $this->fontType = $includeFolder."/04B_08__.TTF";
            }
            function upLoad($inputName) {
                    $imageName = time();//设定当前时间为图片名称
                    if(@empty($_FILES[$inputName]["name"])) die("没有上传图片信息,请确认");
                    $name = explode(".",$_FILES[$inputName]["name"]);//将上传前的文件以“.”分开取得文件类型
                    $imgCount = count($name);//获得截取的数量
                    $imgType = $name[$imgCount-1];//取得文件的类型
                    if(strpos($this->upFileType,$imgType) === false) die("上传文件类型仅支持 ".$this->upFileType." 不支持 ".$imgType);
                    $photo = $imageName.".".$imgType;//写入数据库的文件名
                    $uploadFile = $this->annexFolder."/".$photo;//上传后的文件名称
                    $upFileok = move_uploaded_file($_FILES[$inputName]["tmp_name"],$uploadFile);
                    if($upFileok) {
                            $imgSize = $_FILES[$inputName]["size"];
                            $kSize = round($imgSize/1024);
                            if($kSize > ($this->upFileMax*1024)) {
                                    @unlink($uploadFile);
                                    die("上传文件超过 ".$this->upFileMax."KB");
                            }
                    } else {
                            die("上传图片失败,请确认你的上传文件不超过 $upFileMax KB 或上传时间超时");
                    }
                    return $photo;
            }
            function getInfo($photo) {
                    $photo = $this->annexFolder."/".$photo;
                    $imageInfo = getimagesize($photo);
                    $imgInfo["width"] = $imageInfo[0];
                    $imgInfo["height"] = $imageInfo[1];
                    $imgInfo["type"] = $imageInfo[2];
                    $imgInfo["name"] = basename($photo);
                    return $imgInfo;
            }
            function smallImg($photo,$width=128,$height=128) {
                    $imgInfo = $this->getInfo($photo);
                    $photo = $this->annexFolder."/".$photo;//获得图片源
                    $newName = substr($imgInfo["name"],0,strrpos($imgInfo["name"], "."))."_thumb.jpg";//新图片名称
                    if($imgInfo["type"] == 1) {
                            $img = imagecreatefromgif($photo);
                    } elseif($imgInfo["type"] == 2) {
                            $img = imagecreatefromjpeg($photo);
                    } elseif($imgInfo["type"] == 3) {
                            $img = imagecreatefrompng($photo);
                    } else {
                            $img = "";
                    }
                    if(empty($img)) return False;
                    $width = ($width > $imgInfo["width"]) ? $imgInfo["width"] : $width; 
                    $height = ($height > $imgInfo["height"]) ? $imgInfo["height"] : $height; 
                    $srcW = $imgInfo["width"]; 
                    $srcH = $imgInfo["height"]; 
                    if ($srcW * $width > $srcH * $height) {
                            $height = round($srcH * $width / $srcW);
                    } else {
                            $width = round($srcW * $height / $srcH);
                    }
                    if (function_exists("imagecreatetruecolor")) {
                            $newImg = imagecreatetruecolor($width, $height);
                            ImageCopyResampled($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]);
                    } else {
                            $newImg = imagecreate($width, $height);
                            ImageCopyResized($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]);
                    }
                    if ($this->toFile) {
                            if (file_exists($this->annexFolder."/".$this->smallFolder."/".$newName)) @unlink($this->annexFolder."/".$this->smallFolder."/".$newName);
                            ImageJPEG($newImg,$this->annexFolder."/".$this->smallFolder."/".$newName);
                            return $this->annexFolder."/".$this->smallFolder."/".$newName;
                    } else {
                            ImageJPEG($newImg);
                    }
                    ImageDestroy($newImg);
                    ImageDestroy($img);
                    return $newName;
            }
            function waterMark($photo,$text) {
                    $imgInfo = $this->getInfo($photo);
                    $photo = $this->annexFolder."/".$photo;
                    $newName = substr($imgInfo["name"], 0, strrpos($imgInfo["name"], ".")) . "_.jpg";
                    switch ($imgInfo["type"]) {
                            case 1:
                                    $img = imagecreatefromgif($photo);
                            break;
                            case 2:
                                    $img = imagecreatefromjpeg($photo);
                            break;
                            case 3:
                                    $img = imagecreatefrompng($photo);
                            break;
                            default:
                                    return False;
                    }
                    if (empty($img)) return False;
                    $width = ($this->maxWidth > $imgInfo["width"]) ? $imgInfo["width"] : $this->maxWidth; 
                    $height = ($this->maxHeight > $imgInfo["height"]) ? $imgInfo["height"] : $this->maxHeight; 
                    $srcW = $imgInfo["width"]; 
                    $srcH = $imgInfo["height"]; 
                    if ($srcW * $width > $srcH * $height) {
                            $height = round($srcH * $width / $srcW);
                    } else {
                            $width = round($srcW * $height / $srcH);
                    }
                    if (function_exists("imagecreatetruecolor")) {
                            $newImg = imagecreatetruecolor($width, $height);
                            ImageCopyResampled($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]);
                    } else {
                            $newImg = imagecreate($width, $height);
                            ImageCopyResized($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]);
                    }
                    
                    $white = imageColorAllocate($newImg, 255, 255, 255);
                    $black = imageColorAllocate($newImg, 0, 0, 0);
                    $alpha = imageColorAllocateAlpha($newImg, 230, 230, 230, 40);
                    ImageFilledRectangle($newImg, 0, $height-26, $width, $height, $alpha);
                    ImageFilledRectangle($newImg, 13, $height-20, 15, $height-7, $black);
                    ImageTTFText($newImg, 4.9, 0, 20, $height-14, $black, $this->fontType, $text[0]);
                    ImageTTFText($newImg, 4.9, 0, 20, $height-6, $black, $this->fontType, $text[1]);
                    if($this->toFile) {
                            if (file_exists($this->annexFolder."/".$this->Folder."/".$newName)) @unlink($this->annexFolder."/".$this->Folder."/".$newName);
                            ImageJPEG($newImg,$this->annexFolder."/".$this->Folder."/".$newName);
                            return $this->annexFolder."/".$this->Folder."/".$newName;
                    } else {
                            ImageJPEG($newImg);
                    }
                    ImageDestroy($newImg);
                    ImageDestroy($img);
                    return $newName;
            }
    }
    ?>
      

  2.   

    使用方法如下(可以解决你的问题):<?php
    $annexFolder = "annex";
    $smallFolder = "smallimg";
    $Folder = "";
    $includeFolder = "include";
    require("./".$includeFolder."/upfile.php");$img = new UPImages($annexFolder,$smallFolder,$includeFolder); 
    $text = array("www.dananwa.com.cn","all rights reserved");
    $photo = $img->upLoad("upfile");
    $img->maxWidth = $img->maxHeight = 500;//设置生成水印图的大小(单位像素,自动适应大小不会造成变形)
    $img->toFile = true;
    $newSmallImg = $img->smallImg($photo,300,200);
    $newMark = $img->waterMark($photo,$text);
    echo "小图预览:<br><img src='".$newSmallImg."' border='0'><br><br>";
    echo "水印图预览:<br><img src='".$newMark."' border='0'><br><br>";
    ?>
      

  3.   

    楼主的要求是可以实现的../*
    **裁切图片并生成新图片函数
    *
    *$orgpath——原图片路径images/upload/2006/2006-12/2006-12-27/IMG_0151.gif
    $objpath——目标图片路径images/upload/2006/2006-12/2006-12-27/IMG_0153.gif
    *$x——裁切的起点X坐标
    *$y——裁切的起点Y坐标
    *$width——裁切的宽度
    *$height——裁切的高度
    */function createcutphoto($orgpath,$objpath,$x,$y,$width,$height)
    {
       list($owidth,$oheight) = getimagesize($orgpath);
       $n_image = imagecreatetruecolor($width,$height);
       $image = imagecreatefromjpeg($orgpath);
       @imagecopyresampled($n_image,$image,0,0,$x,$y,$owidth,$oheight,$owidth,$oheight);
       @imagejpeg($n_image,$objpath,100);
    }
      

  4.   

    有个叫thumb.class.php的类应该可以实现LZ的要求
    这个类生成缩略图,给图片加边框,水印,裁减都可以实现。