note 86214 added to function.imagecreatefromwbmp

[email protected]
Newsgroups php.notes
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.