note 99510 added to function.imagecreatefromwbmp
| From: | cromozon at swn dot nu | Date: | Fri, 20 Aug 2010 18:30:38 +0000 |
| Subject: | note 99510 added to function.imagecreatefromwbmp | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-171896@lists.php.net to get a copy of this message | ||
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;
}
?>
----
Server IP: 69.147.83.197
Probable Submitter: 62.61.140.9
----
Manual Page -- http://www.php.net/manual/en/function.imagecreatefromwbmp.php
Edit -- https://master.php.net/note/edit/99510
Del: integrated -- https://master.php.net/note/delete/99510/integrated
Del: useless -- https://master.php.net/note/delete/99510/useless
Del: bad code -- https://master.php.net/note/delete/99510/bad+code
Del: spam -- https://master.php.net/note/delete/99510/spam
Del: non-english -- https://master.php.net/note/delete/99510/non-english
Del: in docs -- https://master.php.net/note/delete/99510/in+docs
Del: other reasons-- https://master.php.net/note/delete/99510
Reject -- https://master.php.net/note/reject/99510
Search -- https://master.php.net/manage/user-notes.php