PHP程序员学习笔记|如何学习PHP

个人总结的PHP学习方法


php将bmp图片转为jpg,png,gif格式(兼容)

2017-6-28 0phpcom 经典文章


php gd默认不能处理bmp格式的图片,在网上找了一个方法,修复了32位bmp图片的问题,现在能将bmp转为jpg,png,gif格式,方法已经测试验证OK,具体方法如下:


<?php
/**
*
bmp格式转为jpggifpng格式的图片
* User: XiaoRui
* Date: 2017/5/17
*/

function ImageCreateFromBMP($filename) {
   if (!$f1 = fopen($filename, "rb"))
       return false;

   $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1, 14));
   if ($FILE['file_type'] != 19778)
       return false;

   $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel' .
       
'/Vcompression/Vsize_bitmap/Vhoriz_resolution' .
       
'/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1, 40));
   $BMP['colors'] = pow(2, $BMP['bits_per_pixel']);
   if ($BMP['size_bitmap'] == 0)
       $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
   $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel'] / 8;
   $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
   $BMP['decal'] = ($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
   $BMP['decal'] -= floor($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
   $BMP['decal'] = 4 - (4 * $BMP['decal']);
   if ($BMP['decal'] == 4)
       $BMP['decal'] = 0;

   $PALETTE = array();
   if ($BMP['colors'] < 16777216) {
       $PALETTE = unpack('V' . $BMP['colors'], fread($f1, $BMP['colors'] * 4));
   }

   $IMG = fread($f1, $BMP['size_bitmap']);
   $VIDE = chr(0);

   $res = imagecreatetruecolor($BMP['width'], $BMP['height']);
   $P = 0;
   $Y = $BMP['height'] - 1;
   while ($Y >= 0) {
       $X = 0;
       while ($X < $BMP['width']) {
           switch ($BMP['bits_per_pixel']) {
               case 32:
                   
$COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE);
                   break;
               case 24:
                   
$COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE);
                   break;
               case 16:
                   
$COLOR = unpack("n", substr($IMG, $P, 2));
                   $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                   break;
               case 8:
                   
$COLOR = unpack("n", $VIDE . substr($IMG, $P, 1));
                   $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                   break;
               case 4:
                   
$COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1));
                   if (($P * 2) % 2 == 0)
                       $COLOR[1] = ($COLOR[1] >> 4);
                   else
                       
$COLOR[1] = ($COLOR[1] & 0x0F);
                   $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                   break;
               case 1:
                   
$COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1));
                   if (($P * 8) % 8 == 0)
                       $COLOR[1] = $COLOR[1] >> 7;
                   elseif (($P * 8) % 8 == 1)
                       $COLOR[1] = ($COLOR[1] & 0x40) >> 6;
                   elseif (($P * 8) % 8 == 2)
                       $COLOR[1] = ($COLOR[1] & 0x20) >> 5;
                   elseif (($P * 8) % 8 == 3)
                       $COLOR[1] = ($COLOR[1] & 0x10) >> 4;
                   elseif (($P * 8) % 8 == 4)
                       $COLOR[1] = ($COLOR[1] & 0x8) >> 3;
                   elseif (($P * 8) % 8 == 5)
                       $COLOR[1] = ($COLOR[1] & 0x4) >> 2;
                   elseif (($P * 8) % 8 == 6)
                       $COLOR[1] = ($COLOR[1] & 0x2) >> 1;
                   elseif (($P * 8) % 8 == 7)
                       $COLOR[1] = ($COLOR[1] & 0x1);
                   $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                   break;
               default:
                   return false
;
                   break;
           }

           imagesetpixel($res, $X, $Y, $COLOR[1]);
           $X++;
           $P += $BMP['bytes_per_pixel'];
       }
       $Y--;
       $P+=$BMP['decal'];
   }
   fclose($f1);
   return $res;
}

$pic = 'b11.bmp';
$res = ImageCreateFromBMP($pic);

/**
*
温馨提示:
* pngjpg格式图片可以设置压缩级别,具体范围如下:
* png格式图片压缩范围为 0-9
* jpg
格式图片压缩范围从 0-100,(默认值大约为75
* 数字越小压缩的就越厉害,则质量越差、体积越小。
* 如果超出压缩范围会报错,如下:
* Warning: imagepng(): gd-png error: compression level must be 0 through 9 in E:\wwwroot\ttt.php on line 110
*/
imagepng($res, 'b11.png', 10); //生成质量为9的图片
imagegif($res, 'b11.gif');
imagejpeg($res, 'b11.jpg', 0); //生成质量为90的图片


将以上代码保存到一个php文件就可以运行了。

« 直接git config和带--global、--system的区别 | ext_skel_win32创建php扩展框架报“sh”不是内部或外部命令»
发表评论:









订阅Rss