HTML5新特性结合PHP实现多图片格式转换功能 欢迎讨论

来源:互联网 发布:asp.net php学那个好 编辑:程序博客网 时间:2024/05/22 06:41

    开博第一篇 

       以前有朋友问如何进行图片的批量格式转换,我一直想通过PHP去实现这个功能,但是以前仅仅只是会html4,并了解到多文件上传超麻烦发火。最近一直在看关于HTML5的书籍,了解到HTML5可以简单实现多文件上传功能,就一直在研究如何实现批量图片格式转换,大概一直忙了大概2天吧(断断续续),终于皇天不负有心人,实现了功能,激动ing~~羡慕 所以就把它分享出来作为我的第一篇博客,不完善之处还请各位大神不吝赐教微笑

     说到图片格式转换,有大致两种方法:

                     ①暴力型:服务器直接对图片后缀进行修改(之前的第一想法就是这个,但是问了度娘后才知道,这种方法是不可行的,原因很简单,表变质不变)。

                     ②温柔型:服务器通过imagegif,imagejpeg,imagepng等方法对图片进行格式转换,可行。

     图片批量格式转换工作流介绍:

                     ①客户端进行多图片上传

                     ②服务器端接收图片并进行保存,对每个图片进行格式转换并一同保存到另一个文件夹中,然后对后一文件夹中图片进行压缩打包

                     ③客户端下载压缩包

                     ④服务器端确认客户端下载完成之后对源文件,目标文件以及压缩包进行删除。

   注:在最后的时候遇到个问题,那就是如何判断客户端下载压缩包成功呢?

     问题描述:图片批量处理完成之后会对这些图片进行压缩从而产生压缩包,在客户端下载压缩包完成之后,需要删除该压缩包,从而再进行下一批次的图片处理(如果不删除压缩包的话,下一次处理所得到的图片会被压缩进之前的压缩包,出现返回文件错误)

    那么如何解决呢? 刚开始想的是,在下载语句后直接通过unlink()删除压缩包,但是在测试的过程中,会发现文件在下载过程中突然会出现404 not found错误(原因文件下载过程中被删除) 然后想的是,先判断文件是否下载完成,如果完成的话,在删除压缩包(但是百度了一会儿,发现实现貌似很难难过) 最后,突然想到,如果我在PHP处理代码中在脚步一开始就判断是否有该压缩包存在,如果存在的话,删除它,这样就完美解决喽~~。

      

    接下来就贴代码喽 ~~(部分代码来源于摘于其他博客)

 【1】html

<!DOCTYPE html><head><title>批量文件格式转换小助手</title><meta charset="utf-8"></head><body bgcolor="#EEEEFF"> <form method="post" action="imageChange.php" enctype="multipart/form-data">  <!--表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码。 -->  <input type="file" name="upload[]" id="file" multiple size="200">  <input type="submit" value="文件上传"> </form></body></html>
  

  【2】PHP

<?php  include 'change.class.php'; //上传图片个数 $x=count($_FILES['upload']['name']); //上传文件个数 //定义图片路径 $filePath = './images/'; $dstPath= './images_change/'; //判断文件夹是否存在 if(!is_dir($filePath)){ mkdir($filePath); } if(file_exists("img_final.zip")){    unlink("img_final.zip");}  //定义可处理图片格式 $type = array('gif','jpeg','png','wbmp','jpg'); //后缀判断 for ($i=0; $i < $x; $i++) {  # code...    //利用Iconv函数对文件名进行重新编码 防止乱码 $_FILES['upload']['name'][$i] = iconv('utf-8','gb2312',$_FILES['upload']['name'][$i]); var_dump($_FILES['upload']['name'][$i]); in_array((strtolower(substr(strchr($_FILES['upload']['name'][$i],'.'),1))),$type); $fileType = implode(',',$type); $filename = $_FILES['upload']['name'][$i]; if(file_exists($filePath)){ $bool = move_uploaded_file($_FILES['upload']['tmp_name'][$i], $filePath.$filename); } }  //图片处理及保存 $img = new ResizeImage(); for($j=0; $j < $x; $j++) { $img->sourceFile = $filePath.$_FILES['upload']['name'][$j]; $img_path1[$j] = $img->sourceFile; $fiel_1=substr($_FILES['upload']['name'][$j], 0,strrpos($_FILES['upload']['name'][$j], '.')); $img->dstFile = $dstPath.$fiel_1; $img->dstFile = $img->dstFile.".jpg"; $img_path2[$j] = $img->dstFile; $img->draw(95); }  //压缩文件 $zip = new ZipArchive; $res = $zip->open('img_final.zip', ZipArchive::CREATE); if ($res === TRUE) { for ($m=0; $m < $x ; $m++) {  $zip->addFromString("$img_path2[$m]", '转换已完成!'); } $zip->close(); echo 'ok'; } else { echo 'failed'; } //下载部分 Header("Location: http://127.0.0.1/ImageChange/img_final.zip");  for ($i=0; $i < $x ; $i++) {  unlink($img_path1[$i]); unlink($img_path2[$i]); } //unlink("img_final.zip");?>

  【3】class类

       

<?php/** * 对png, gif, jpeg, wbmp格式的图像进行转换 * 需要GD库的支持才可以,若要进行gif图像的输出需要GD2.0.28或更高版本才支持* (或* gif的动画转了之后动画变成静画,不知为什么! * */class ResizeImage { const ResizeImageInfo = "本类对图像进行缩小,也可对png, gif, jpeg, wbmp格式的图像进行转换"; //设置目标图像的宽和高  private $height;  private $width; //源图像文件和目标图像文件,若只是输出至浏览器则目标图像文件可不设置  public $sourceFile = '';  //源图像文件 public $dstFile = '';  //目标图像文件 //图像类型“image/gif、image/jpeg、image/png...”  private $imgType;  private $sim; //源图像句柄 private $dim; //目标图像句柄  //是否保存图像,用public void saveFlag(boolean $flag)方法设置  private $saveFlag = true;  //构造函数,当系统不支持GD库时给出异常信息 function __construct()  {   if (!function_exists('imagecreate'))  //function_exists — Return TRUE  if the given function has been defined   {    throw new Exception('你的系统不支持GD库'); //抛出异常 当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。  }  } //输出类作用信息 function __toString()  //__toString()是快速获取对象的字符串信息的便捷方式 {   return ReSizeImage::ResizeImageInfo; //ReSizeImage:图片生成缩略图  类名 :: 静态属性/方法名 } //设置目标图像的宽  public function setWidth($width)  {   if ($width <= 0)   {    throw new Exception('目标图像宽度不能小于0');    return ;   }   $this->width = $width;  } //设置目标图像的高  public function setHeight($height)  {   if ($height <= 0)   {    throw new Exception('目标图像高度不能小于0');    return ;   }   $this->height = $height;  } //设置源图像文件  public function setSourceFile($file)  {   if (!file_exists($file))   {    throw new Exception('源图像文件不存在');    return ;   }   $this->sourceFile = $file;  } //设置目标图像文件  public function setDstFile($file)  {   $this->dstFile = $file;  } //设置是否生成新文件  public function saveFile($flag)  {   $this->saveFlag = (boolean)$flag;  } //执行绘图操作,$quality参数表示生成图像的效果,数字越高,效果越好,不过仅用于jpeg类型的图像  public function draw($quality = 95)  {   $sourceImgInfo = getimagesize($this->sourceFile);  var_dump($sourceImgInfo);  //getimagesize 取得图像大小   // 拓展:返回一个具有四个单元的数组。索引 0 包含图像宽度的像素值,索引 1 包含图像高度的像素值。索引 2 是图像类型的标记:1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。这些标记与 PHP 4.3.0 新加的 IMAGETYPE 常量对应。索引 3 是文本字符串,内容为“height="yyy" width="xxx"”,可直接用于 IMG 标记。   if (!is_array($sourceImgInfo))   {    throw new Exception('源图像文件不存在');    return ;   }   switch($sourceImgInfo[2])  {    case 1:     $this->imgType="image/gif";     $this->sim = imagecreatefromgif($this->sourceFile);     break;    case 2:     $this->imgType="image/jpeg"; //jpg与jpeg相同    $this->sim = imagecreatefromjpeg($this->sourceFile);     break;    case 3:     $this->imgType="image/png";     $this->sim = imagecreatefrompng($this->sourceFile);     break;    case 15:     $this->imgType="image/wbmp";     $this->sim = imagecreatefromwbmp($this->sourceFile);     break;    default:     return '不支持的图像格式';    break;   }  //设置目标图像的实际宽和高   $dstWidth = $sourceWidth = $sourceImgInfo[0];   $dstHeight = $sourceHeight = $sourceImgInfo[1];    //建立目标图像的句柄   $this->dim = @imagecreatetruecolor($dstWidth, $dstHeight) or imagecreate($dstWidth, $dstHeight);  //imagecreatetruecolor — 新建一个真彩色图像  //imagecreate — 新建一个基于调色板的图像  //将真彩色图像转换为调色板图像   imagetruecolortopalette($this->sim, false, 256);  //根据源图像颜色的总数并把它分配到目标图像上   $palsize = ImageColorsTotal($this->sim);   //imagecolorstotal — 取得一幅图像的调色板中颜色的数目  for ($i = 0; $i<$palsize; $i++)   {    $colors = ImageColorsForIndex($this->sim, $i);    //imagecolorsforindex — 取得某索引的颜色    ImageColorAllocate($this->dim, $colors['red'], $colors['green'], $colors['blue']);    //imagecolorallocate — 为一幅图像分配颜色  }  //进行图像的缩放   //imagecopyresampled — 重采样拷贝部分图像并调整大小   imagecopyresampled($this->dim, $this->sim, 0, 0, 0, 0, $dstWidth, $dstHeight, $sourceWidth, $sourceHeight);  //生成新的目标图像   if ($this->saveFlag)   {     //strrpos — 计算指定字符串在目标字符串中最后一次出现的位置   $imgExt = substr($this->dstFile, strrpos($this->dstFile, '.') + 1);    switch(strtolower($imgExt))   {    case 'gif':     if (!function_exists('imagegif'))     {      throw new Exception('你的GD库不支持gif图像的输出');      return ;     }     imagegif($this->dim, $this->dstFile);     break;    case 'jpeg':    case 'jpg':     imagejpeg($this->dim, $this->dstFile, $quality);     break;    case 'png':     imagepng($this->dim, $this->dstFile);     break;    case 'wbmp':     imagewbmp($this->dim, $this->dstFile);     break;    default:     return '目标图像文件为空或者格式不对,无法进行保存';     break;    }   }  //直接输出目标图像至浏览器   else   {    header ("Content-type: " . $this->imgType);    switch($sourceImgInfo[2])   {     case 1:      imagegif($this->dim);      break;     case 2:      imagejpeg($this->dim, '', $quality);      break;     case 3:      imagepng($this->dim);      break;     case 15:      imagewbmp($this->dim);      break;     default:      return '不支持的图像格式';      break;    }   }   return ;  } function __destruct()  {   @ImageDestroy($this->sim);   @ImageDestroy($this->dim);  } } ?>


3 0
原创粉丝点击