note 99976 added to function.imagecreate
| From: | Francois99 at osu1 dot php dot net | Date: | Fri, 17 Sep 2010 14:25:47 +0000 |
| Subject: | note 99976 added to function.imagecreate | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-172678@lists.php.net to get a copy of this message | ||
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);
}
----
Server IP: 69.147.83.197
Probable Submitter: 83.180.38.71
----
Manual Page -- http://www.php.net/manual/en/function.imagecreate.php
Edit -- https://master.php.net/note/edit/99976
Del: integrated -- https://master.php.net/note/delete/99976/integrated
Del: useless -- https://master.php.net/note/delete/99976/useless
Del: bad code -- https://master.php.net/note/delete/99976/bad+code
Del: spam -- https://master.php.net/note/delete/99976/spam
Del: non-english -- https://master.php.net/note/delete/99976/non-english
Del: in docs -- https://master.php.net/note/delete/99976/in+docs
Del: other reasons-- https://master.php.net/note/delete/99976
Reject -- https://master.php.net/note/reject/99976
Search -- https://master.php.net/manage/user-notes.php