note 99510 deleted from function.imagecreatefromwbmp by danbrown

From: Date: Fri, 20 Aug 2010 18:34:35 +0000
Subject: note 99510 deleted from function.imagecreatefromwbmp by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-171897@lists.php.net to get a copy of this message
Note Submitter: cromozon at swn dot nu ---- Alexanders codes assumed 24bit RGB layout. I have updated the code so it works with 32bit RGBA and 8bit Grayscale, so here are my two cents. <?php 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] ); // Get num bits $bitPP = hexdec( $header_parts [28] ); $bytePP = $bitPP / 8; // Get the body offset $bodyStart = hexdec ( $header_parts [11] . $header_parts [10] ); // Unset the header params unset ( $header_parts ); } // Define starting X and Y $x = 0; $y = 1; // Create newimage $image = imagecreatetruecolor ( $width, $height ); //echo $bodyStart; // Grab the body from the image $body = substr ( $hex, $bodyStart * 2 ); // 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); // Use end-line padding? Only when needed $stride = $width * $bytePP; // Length in bytes $usePadding = $stride % 4; //$usePadding = ($bytePP == 4) ? 0 : ($body_size > ($header_size * 3) + 4); //$usePadding = ($width * $bytePP / 4); //echo $bytePP; //echo $pad; // 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 += $bytePP) { // 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 += 1;//$usePadding;//$i += $pad; // 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; if ($bytePP == 1) // Grayscale { $a = 0x00; $r = $g = $b = hexdec ( $body [$i_pos] . $body [$i_pos + 1] ); } else if ($bytePP == 3) // RGB { $a = 0x00; $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] ); } else if ($bytePP == 4) // RGBA { $a = 0xFF - hexdec ( $body [$i_pos + 6] . $body [$i_pos + 7] ); $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 = imagecolorallocatealpha( $image, $r, $g, $b, $a ); imagesetpixel ( $image, $x, $height - $y, $color ); // Raise the horizontal position $x ++; } // Unset the body / free the memory unset ( $body ); // Return image-object return $image; } ?>

« previous php.notes (#171897) next »