note 86214 added to function.imagecreatefromwbmp

From: Date: Wed, 08 Oct 2008 11:59:12 +0000
Subject: note 86214 added to function.imagecreatefromwbmp
Groups: php.notes 
Request: Send a blank email to php-notes+get-145158@lists.php.net to get a copy of this message
AeroX created a nice example, but it only works at specific imagesizes because bmp uses fully 32-bit lines. To prevent failures (different colors, pixel-shifting per line), the solution is to skip the padding, inserted after color-pixels on the line. His implementation did cutting the padding into the image-data, causing wrong colors, pixel-shifting per line and also an large memory-consumption. I improved this script to the next implementation. The readability of a image is checked by a other function, so it doesn't take part in this script. Suggestions? Please let me know. public 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; } ---- Server IP: 89.248.170.61 Probable Submitter: 87.208.85.212 ---- Manual Page -- http://www.php.net/manual/en/function.imagecreatefromwbmp.php Edit -- https://master.php.net/note/edit/86214 Del: integrated -- https://master.php.net/note/delete/86214/integrated Del: useless -- https://master.php.net/note/delete/86214/useless Del: bad code -- https://master.php.net/note/delete/86214/bad+code Del: spam -- https://master.php.net/note/delete/86214/spam Del: non-english -- https://master.php.net/note/delete/86214/non-english Del: in docs -- https://master.php.net/note/delete/86214/in+docs Del: other reasons-- https://master.php.net/note/delete/86214 Reject -- https://master.php.net/note/reject/86214 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#145158) next »