PHP处理bmp格式图片的方法

具体如下:

白天QA提出项目上传图片有问题,具体为:上传成功,预览失败。我去了之后,又上传了几张其他的图片可以上传,然后仔细问了下他上传的是哪张图片,看了后使用getimagesize函数打印了下。

Array
(
  [0] => 494
  [1] => 260
  [2] => 6
  [3] => width="494" height="260"
  [bits] => 24
  [mime] => image/x-ms-bmp
)

仔细看下,上面打印的数组,mime为image/x-ms-bmp,也就是bmp格式的,印象中php的gd库没有处理这个函数,后来我便在配置文件中,只要mime为这种的便不能上传。

晚上回来后,我便在网上查找php处理bmp相关方法,后来终于在stackoverflow中找到了,帖子里说进入官网的有关imagecreate的函数评论,有个ImageCreateFromBMP方法,先把bmp格式的文件给此函数调用,再用imagejpeg保存就行,后来试了下,发现imagepng也行,下面贴出代码。

<?php
function ImageCreateFromBMP($filename) {
  //Ouverture du fichier en mode binaire
  if (!$f1 = fopen($filename, "rb"))
    return FALSE;
  //1 : Chargement des ent?tes FICHIER
  $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1, 14));
  if ($FILE[‘file_type‘] != 19778)
    return FALSE;
  //2 : Chargement des ent?tes BMP
  $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;
  //3 : Chargement des couleurs de la palette
  $PALETTE = array();
  if ($BMP[‘colors‘] < 16777216) {
    $PALETTE = unpack(‘V‘ . $BMP[‘colors‘], fread($f1, $BMP[‘colors‘] * 4));
  }
  //4 : Cr?ation de l‘image
  $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‘]) {
      if ($BMP[‘bits_per_pixel‘] == 24)
        $COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE);
      elseif ($BMP[‘bits_per_pixel‘] == 16) {
        $COLOR = unpack("n", substr($IMG, $P, 2));
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      } elseif ($BMP[‘bits_per_pixel‘] == 8) {
        $COLOR = unpack("n", $VIDE . substr($IMG, $P, 1));
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      } elseif ($BMP[‘bits_per_pixel‘] == 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];
      }
      elseif ($BMP[‘bits_per_pixel‘] == 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];
      } else
        return FALSE;
      imagesetpixel($res, $X, $Y, $COLOR[1]);
      $X++;
      $P += $BMP[‘bytes_per_pixel‘];
    }
    $Y--;
    $P+=$BMP[‘decal‘];
  }
  //Fermeture du fichier
  fclose($f1);
  return $res;
}
$pic = ‘2.bmp‘;
$res = ImageCreateFromBMP($pic);
imagepng($res, ‘1.png‘);
imagejpeg($res, ‘1.jpeg‘);

网站北京建设 http://www.wangzhanjianshegs.com/

时间: 2024-08-30 09:59:13

PHP处理bmp格式图片的方法的相关文章

关于thinkphp上传bmp格式图片

thinkphp中上传bmp格式图片,缺少了imagecreatefrombmp()方法和imagebmp()方法, 此方法在simplewind\Core\Library\Think\Image\Driver\Gd.class.php中open()和save时调用到,至于其他地方用到的都是相同的方法. //打开图像open中 if('gif' == $this->info['type']){ $class = 'Think\\Image\\Driver\\GIF'; $this->gif =

VC下加载多种格式图片的方法总结IPicture, CxImage, CImage(AtlImage), CPictureEx

尽管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg.gif和png等格式的图片,而这几种格式却是常常要用到的.这里我给大家介绍两种办法来操作这些格式的图片. 1.用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明) OleLoadPicture 函数实际上创建了一个IPicture类型的COM接口对象,然后我们可以通过这个COM接口来操作图片(实际上你也可以用API OleCrea

MFC 的 Picture Control 加载 BMP/PNG 图片的方法

1. 加载 BMP [cpp] view plaincopyprint? CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄 pWnd->ModifyStyle(0, SS_BITMAP); // 修改它的属性为位图 pWnd->SetBitmap((HBITMAP)::LoadImage(NULL, _T("bmp.bmp"), IMAGE_BITMAP, 100, 50, LR_

如何转换并压缩png格式图片

我们常用的图片格式大概就是jpg.png.bmp这些,但是可能用途不一样需要的格式就不一样,那对于常用的图片格式怎么转换呢?如何转换并压缩png格式图片呢? 1.对于常用的图片格式,比如jpg格式以及png,一般情况下需要使用特定的图片格式或者是大小的图片,这时候就需要转换格式或者压缩图片:2.小编常用的是一个电脑端的图片格式转换和图片压缩的工具--迅捷图片格式转换器,可以一键转换和压缩多张图片,点击"图片压缩":3.如果是单张图片可以点击"添加图片",批量转换压缩

怎么把电脑桌面上的CAD图纸转换成BMP格式图纸?

怎么把电脑桌面上的CAD图纸转换成BMP格式图纸?BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广,这时候我们需要将CAD图纸转换成BMP格式的时候我们应该如何进行此项操作呢,会不会很麻烦呢?今天先就要来教教大家如何将电脑桌面上的CAD图纸文件转换成BMP格式图片的全部操作步骤,希望大家能够进行采纳! 第一步:首先要打开你们电脑上面的迅捷CAD转换器软件,电脑上面没有这款软件的可以去到软件商店上面进行

攻略:怎么快速转换heic格式图片

电脑怎么打开heic文件,很多人都会有这样的疑问,需要将其格式转换一下才能在电脑上打开查看,那一起看一下怎么快速转换heic格式图片吧!1.首先在电脑上运行苹果HEIC图片转换器,这类的工具还是蛮多的,但是易操作是比较重要的:2.运行之后,点击"添加图片"按钮,比较喜欢这个转换器的是可以批量转换图片:3.添加过后,会直接跳到预览页,然后可以对转换后的图片的保存位置重新作修改,保存到自己可以找到的位置即可:4.接着是对图片的格式.大小以及图片的画质进行选择,这些都没有固定值,我们只需要根

Android解析获取网络上的图片(支持bmp格式)

Android学习系列 - 显示网络上的图片(支持bmp格式)) 见如下代码: /** * 到Url地址上去下载图片,并回传Bitmap回來 * * @param imgUrl * @return */ public static Bitmap getBitmapFromUrl(String imgUrl) { URL url; Bitmap bitmap = null; try { url = new URL(imgUrl); InputStream is = url.openConnecti

BMP格式的图片怎在线压缩

BMP格式的图片怎在线压缩,大家在上传图片的时候有没有遇到过"因文件太大,上传失败"的问题,图片太大不仅占用空间,而且十分影响传递,那有没有什么解决方法呢,接下来让小编来告诉大家吧. 第一.打开电脑,进入电脑上的浏览器,点开迅捷在线压缩网站. 第二.点入在线压缩的界面后,会看到有三个选项,分别是在线PDF压缩.在线图片压缩.在线视频压缩.我们点击在线图片压缩. 第三.进入在线图片压缩后,点击添加图片在弹出的文件框内加入提前准备好的图片或直接拖曳图片文件至网页里. 第四.添加完需要压缩的

MFC对话框上添加PNG格式的图片的方法

使用CImage类 1.在stdafx.h中加入#include <atlimage.h> 2.在xxxdlg.h中添加CImage m_Img 3.在OnInitDialog中添加m_Img.Load(_T("res\\1.png")); 4.在OnPaint()添加显示png的代码: m_Img.Draw(GetDC()->m_hDC, 0,0); MFC对话框上添加PNG格式的图片的方法