<?PHP
function imagecreatefromBMP($filename)
{ /*http://ru2.php.net/manual/en/function.imagecreate.php#53879*/
if (! $f1 = fopen($filename,"rb")) return FALSE;
$FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14
)); if ($FILE['file_type'] != 19778) return FALSE;
$BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'. '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
'/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40
)); $BMP['colors'] = pow(2
,$BMP['bits_per_pixel']); if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
$BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
$BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']); $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
$BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4
); $BMP['decal'] = 4-(4*$BMP['decal']);
if ($BMP['decal'] == 4) $BMP['decal'] = 0;
if ($BMP['colors'] < 16777216)
{
$PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4
)); }
$IMG = fread($f1,$BMP['size_bitmap']);
$P = 0;
$Y = $BMP['height']-1;
while ($Y >= 0)
{
$X=0;
while ($X < $BMP['width'])
{
if ($BMP['bits_per_pixel'] == 24)
elseif ($BMP['bits_per_pixel'] == 16)
{
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif ($BMP['bits_per_pixel'] == 8)
{
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif ($BMP['bits_per_pixel'] == 4)
{
if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif ($BMP['bits_per_pixel'] == 1)
{
if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7;
elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
else
return FALSE;
$X++;
$P += $BMP['bytes_per_pixel'];
}
$Y--;
$P+=$BMP['decal'];
}
return $res;
}
/********************************************************************/
/*Преобразует картинку в XML */
/********************************************************************/
function img2xml($imgpath, $rgb = false)
{
$img = @imagecreatefromBMP($imgpath);
if (!$img) return -1;
$xml = fopen($imgpath.'.xml', 'w'); if (!$xml) return -2;
fputs($xml, "<img w='$width' h='$height' rgb='$rgb'>\n"); if ($rgb)
for ($y = 0; $y < $height; $y++)
for ($x = 0; $x < $width; $x++) {
$r = ($color >> 16) & 0xFF;
$g = ($color >> 8) & 0xFF;
$b = $color & 0xFF;
fputs($xml, "<pixel> <r>$r</r> <g>$g</g> <b>$b</b> </pixel>\n"); }
else for ($y = 0; $y < $height; $y++)
for ($x = 0; $x < $width; $x++) {
fputs($xml, "<pixel>$color</pixel>\n"); }
return 1;
}
/********************************************************************/
/* Преобразует XML в картинку */
/********************************************************************/
function xml2img($xmlpath, $type = 'jpeg')
{
$xml = fopen($xmlpath, 'r'); if (!$xml) return -1;
preg_match('/w\=\'(\d+)\'\sh\=\'(\d+)\'\srgb\=\'(\w*)\'/', $line, $matches); $width = $matches[1]; $height = $matches[2]; $rgb = $matches[3];
if (!$rgb)
for ($y = 0; $y < $height; $y++)
for ($x = 0; $x < $width; $x++) {
}
else for ($y = 0; $y < $height; $y++)
for ($x = 0; $x < $width; $x++) {
preg_match('/r\>(\w+)\<\/r\>\s\<g\>(\w+)\<\/g\>\s\<b\>(\w+)\</', $line, $matches); $r = $matches[1]; $g = $matches[2]; $b = $matches[3];
}
case 'GIF': imagegif($img, $xmlpath.'.gif'); break; case 'PNG': imagepng($img, $xmlpath.'.png'); break; case 'WBMP': imagewbmp($img, $xmlpath.'.wbmp'); break; case 'JPEG':
case 'JPG':
default: imagejpeg($img, $xmlpath.'.jpeg'); ; }
return 1;
}
/********************************************************************/
/* Выводит картинку в браузер точками )) */
/* Не знаю зачем, но интересно. Только всё подвисает.... */
/********************************************************************/
function xml_output($xmlpath)
{
$xml = fopen($xmlpath, 'r'); if (!$xml) return -1;
preg_match('/w\=\'(\w+)\'\sh\=\'(\w+)\'\srgb\=\'(\w*)\'/', $line, $matches); $width = $matches[1]; $height = $matches[2]; $rgb = $matches[3];
if (!$rgb)
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$r = ($color >> 16) & 0xFF;
$g = ($color >> 8) & 0xFF;
$b = $color & 0xFF;
echo "<span style=' position: absolute; color: rgb($r, $g, $b); left: $x; top: $y'>.</span>";
}
}
else for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
preg_match('/r\>(\w+)\<\/r\>\s\<g\>(\w+)\<\/g\>\s\<b\>(\w+)\</', $line, $matches); $r = $matches[1]; $g = $matches[2]; $b = $matches[3];
echo "<span style='position: absolute; color: rgb($r, $g, $b); left: $x; top: $y'>.</span>";
}
}
return 1;
}
$ix = img2xml('kartinka.bmp');
switch ($ix) {
case -1
: die('Не удается открыть картинку'); case -2
: die('Не удается создать файл с результатом'); }
$xi = xml2img('kartinka.bmp.xml', 'jpeg');
if ($xi == -1
) die('Не удается открыть xml'); //echo xml_output('kartinka.bmp.xml'); // с большими картинками не стоит эксперементировать
?>