You are here

public static function PHPExcel_Shared_Drawing::imagecreatefrombmp in Loft Data Grids 7.2

Same name and namespace in other branches
  1. 6.2 vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/Drawing.php \PHPExcel_Shared_Drawing::imagecreatefrombmp()

* Create a new image from file. By alexander at alexauto dot nl * * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214 *

Parameters

string $filename Path to Windows DIB (BMP) image: * @return resource

1 call to PHPExcel_Shared_Drawing::imagecreatefrombmp()
PHPExcel_Writer_Excel5::_buildWorkbookEscher in vendor/phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel5.php
* Build the Escher object corresponding to the MSODRAWINGGROUP record

File

vendor/phpoffice/phpexcel/Classes/PHPExcel/Shared/Drawing.php, line 179

Class

PHPExcel_Shared_Drawing
PHPExcel_Shared_Drawing

Code

public static function imagecreatefrombmp($p_sFile) {

  //    Load the image into a string
  $file = fopen($p_sFile, "rb");
  $read = fread($file, 10);
  while (!feof($file) && $read != "") {
    $read .= fread($file, 1024);
  }
  $temp = unpack("H*", $read);
  $hex = $temp[1];
  $header = substr($hex, 0, 108);

  //    Process the header
  //    Structure: http://www.fastgraph.com/help/bmp_header_format.html
  if (substr($header, 0, 4) == "424d") {

    //    Cut it in parts of 2 bytes
    $header_parts = str_split($header, 2);

    //    Get the width        4 bytes
    $width = hexdec($header_parts[19] . $header_parts[18]);

    //    Get the height        4 bytes
    $height = hexdec($header_parts[23] . $header_parts[22]);

    //    Unset the header params
    unset($header_parts);
  }

  //    Define starting X and Y
  $x = 0;
  $y = 1;

  //    Create newimage
  $image = imagecreatetruecolor($width, $height);

  //    Grab the body from the image
  $body = substr($hex, 108);

  //    Calculate if padding at the end-line is needed
  //    Divided by two to keep overview.
  //    1 byte = 2 HEX-chars
  $body_size = strlen($body) / 2;
  $header_size = $width * $height;

  //    Use end-line padding? Only when needed
  $usePadding = $body_size > $header_size * 3 + 4;

  //    Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
  //    Calculate the next DWORD-position in the body
  for ($i = 0; $i < $body_size; $i += 3) {

    //    Calculate line-ending and padding
    if ($x >= $width) {

      //    If padding needed, ignore image-padding
      //    Shift i to the ending of the current 32-bit-block
      if ($usePadding) {
        $i += $width % 4;
      }

      //    Reset horizontal position
      $x = 0;

      //    Raise the height-position (bottom-up)
      $y++;

      //    Reached the image-height? Break the for-loop
      if ($y > $height) {
        break;
      }
    }

    //    Calculation of the RGB-pixel (defined as BGR in image-data)
    //    Define $i_pos as absolute position in the body
    $i_pos = $i * 2;
    $r = hexdec($body[$i_pos + 4] . $body[$i_pos + 5]);
    $g = hexdec($body[$i_pos + 2] . $body[$i_pos + 3]);
    $b = hexdec($body[$i_pos] . $body[$i_pos + 1]);

    //    Calculate and draw the pixel
    $color = imagecolorallocate($image, $r, $g, $b);
    imagesetpixel($image, $x, $height - $y, $color);

    //    Raise the horizontal position
    $x++;
  }

  //    Unset the body / free the memory
  unset($body);

  //    Return image-object
  return $image;
}