Home  >  Article  >  Web Front-end  >  Steps to process bmp format images with PHP

Steps to process bmp format images with PHP

小云云
小云云Original
2018-02-10 10:24:042261browse

During the day, QA pointed out that there was a problem with uploading images of the project, specifically: the upload was successful, but the preview failed. After I went there, I uploaded a few other pictures that could be uploaded, and then carefully asked him which picture he uploaded. After reading it, I printed it using the getimagesize function. This article mainly introduces the method of PHP processing bmp format images, and analyzes the related functions and usage skills of PHP operating bmp format images based on specific examples. Friends who need it can refer to it. I hope it can help everyone.


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

Look carefully. The mime of the array printed above is image/x-ms-bmp, which is in bmp format. I have the impression that the gd library of PHP does not handle this. function, then I put it in the configuration file, and as long as the mime is this, it cannot be uploaded.

After I came back in the evening, I searched for methods related to php processing bmp on the Internet, and finally found it in stackoverflow. The post said that there was a comment about the imagecreate function on the official website, there was ImageCreateFromBMP The method is to first call this function the file in bmp format, and then save it with imagejpeg. Later, I tried it and found that imagepng also works. The code is posted below.


<?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[&#39;file_type&#39;] != 19778)
    return FALSE;
  //2 : Chargement des ent�tes BMP
  $BMP = unpack(&#39;Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel&#39; .
      &#39;/Vcompression/Vsize_bitmap/Vhoriz_resolution&#39; .
      &#39;/Vvert_resolution/Vcolors_used/Vcolors_important&#39;, fread($f1, 40));
  $BMP[&#39;colors&#39;] = pow(2, $BMP[&#39;bits_per_pixel&#39;]);
  if ($BMP[&#39;size_bitmap&#39;] == 0)
    $BMP[&#39;size_bitmap&#39;] = $FILE[&#39;file_size&#39;] - $FILE[&#39;bitmap_offset&#39;];
  $BMP[&#39;bytes_per_pixel&#39;] = $BMP[&#39;bits_per_pixel&#39;] / 8;
  $BMP[&#39;bytes_per_pixel2&#39;] = ceil($BMP[&#39;bytes_per_pixel&#39;]);
  $BMP[&#39;decal&#39;] = ($BMP[&#39;width&#39;] * $BMP[&#39;bytes_per_pixel&#39;] / 4);
  $BMP[&#39;decal&#39;] -= floor($BMP[&#39;width&#39;] * $BMP[&#39;bytes_per_pixel&#39;] / 4);
  $BMP[&#39;decal&#39;] = 4 - (4 * $BMP[&#39;decal&#39;]);
  if ($BMP[&#39;decal&#39;] == 4)
    $BMP[&#39;decal&#39;] = 0;
  //3 : Chargement des couleurs de la palette
  $PALETTE = array();
  if ($BMP[&#39;colors&#39;] < 16777216) {
    $PALETTE = unpack(&#39;V&#39; . $BMP[&#39;colors&#39;], fread($f1, $BMP[&#39;colors&#39;] * 4));
  }
  //4 : Cr�ation de l&#39;image
  $IMG = fread($f1, $BMP[&#39;size_bitmap&#39;]);
  $VIDE = chr(0);
  $res = imagecreatetruecolor($BMP[&#39;width&#39;], $BMP[&#39;height&#39;]);
  $P = 0;
  $Y = $BMP[&#39;height&#39;] - 1;
  while ($Y >= 0) {
    $X = 0;
    while ($X < $BMP[&#39;width&#39;]) {
      if ($BMP[&#39;bits_per_pixel&#39;] == 24)
        $COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE);
      elseif ($BMP[&#39;bits_per_pixel&#39;] == 16) {
        $COLOR = unpack("n", substr($IMG, $P, 2));
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      } elseif ($BMP[&#39;bits_per_pixel&#39;] == 8) {
        $COLOR = unpack("n", $VIDE . substr($IMG, $P, 1));
        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
      } elseif ($BMP[&#39;bits_per_pixel&#39;] == 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[&#39;bits_per_pixel&#39;] == 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[&#39;bytes_per_pixel&#39;];
    }
    $Y--;
    $P+=$BMP[&#39;decal&#39;];
  }
  //Fermeture du fichier
  fclose($f1);
  return $res;
}
$pic = &#39;2.bmp&#39;;
$res = ImageCreateFromBMP($pic);
imagepng($res, &#39;1.png&#39;);
imagejpeg($res, &#39;1.jpeg&#39;);

Related recommendations:

bmp format pictures php Convert bmp pictures to jpg and other pictures in any format

[GD] Generate images in bmp format (imagebmp)

[GD] Generate images in bmp format_PHP

The above is the detailed content of Steps to process bmp format images with PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn