note 99976 deleted from function.imagecreate by danbrown

From: Date: Fri, 17 Sep 2010 14:32:54 +0000
Subject: note 99976 deleted from function.imagecreate by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-172679@lists.php.net to get a copy of this message
Note Submitter: Francois99 ---- function ImageCreateFromBMP($filename) When I use a local filename everything goes well (in this case 24bits bmp images) but when I use the same bmp image via an url (local was saved in windows via the url) then I get errors like "unpack() [function.unpack]: Type V: not enough input, need 4, have 3" and the image is mainly black. I found this class (functions, see below) (only for 24bits) and works as well for local as images via an url. This can be used like (examples): $im = imagecreatefrombmp('test.bmp'); imagepng($im); (or Bmp::imagebmp($im);) Class (functions) : // Read & Save 24bit BMP files // Author: de77 // Licence: MIT // Webpage: de77.com // Version: 07.02.2010 class BMP { public static function imagebmp(&$img, $filename = false) { return imagebmp($img, $filename); } public static function imagecreatefrombmp($filename) { return imagecreatefrombmp($filename); } } function imagebmp(&$img, $filename = false) { $wid = imagesx($img); $hei = imagesy($img); $wid_pad = str_pad('', $wid % 4, "\0"); $size = 54 + ($wid + $wid_pad) * $hei; //prepare & save header $header['identifier'] = 'BM'; $header['file_size'] = dword($size); $header['reserved'] = dword(0); $header['bitmap_data'] = dword(54); $header['header_size'] = dword(40); $header['width'] = dword($wid); $header['height'] = dword($hei); $header['planes'] = word(1); $header['bits_per_pixel'] = word(24); $header['compression'] = dword(0); $header['data_size'] = dword(0); $header['h_resolution'] = dword(0); $header['v_resolution'] = dword(0); $header['colors'] = dword(0); $header['important_colors'] = dword(0); if ($filename) { $f = fopen($filename, "wb"); foreach ($header AS $h) { fwrite($f, $h); } //save pixels for ($y=$hei-1; $y>=0; $y--) { for ($x=0; $x<$wid; $x++) { $rgb = imagecolorat($img, $x, $y); fwrite($f, byte3($rgb)); } fwrite($f, $wid_pad); } fclose($f); } else { foreach ($header AS $h) { echo $h; } //save pixels for ($y=$hei-1; $y>=0; $y--) { for ($x=0; $x<$wid; $x++) { $rgb = imagecolorat($img, $x, $y); echo byte3($rgb); } echo $wid_pad; } } } function imagecreatefrombmp($filename) { $f = fopen($filename, "rb"); //read header $header = fread($f, 54); $header = unpack( 'c2identifier/Vfile_size/Vreserved/Vbitmap_data/Vheader_size/' . 'Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vdata_size/'. 'Vh_resolution/Vv_resolution/Vcolors/Vimportant_colors', $header); if ($header['identifier1'] != 66 or $header['identifier2'] != 77) { die('Not a valid bmp file'); } if ($header['bits_per_pixel'] != 24) { die('Only 24bit BMP images are supported'); } $wid2 = ceil((3*$header['width']) / 4) * 4; $wid = $header['width']; $hei = $header['height']; $img = imagecreatetruecolor($header['width'], $header['height']); //read pixels for ($y=$hei-1; $y>=0; $y--) { $row = fread($f, $wid2); $pixels = str_split($row, 3); for ($x=0; $x<$wid; $x++) { imagesetpixel($img, $x, $y, dwordize($pixels[$x])); } } fclose($f); return $img; } function dwordize($str) { $a = ord($str[0]); $b = ord($str[1]); $c = ord($str[2]); return $c*256*256 + $b*256 + $a; } function byte3($n) { return chr($n & 255) . chr(($n >> 8) & 255) . chr(($n >> 16) & 255); } function dword($n) { return pack("V", $n); } function word($n) { return pack("v", $n); }

« previous php.notes (#172679) next »