Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008
Откуда: Москва
Помог: 57 раз(а)
|
Читал я как-то bash.org.ru n наткнулся там на мудрую мысль. Мудрая мысль изображала как выглядела бы картинка, если ее конвертнуть в xml. По пикселям.
После небольшого раздумья мне стало интересно, а если эту xml-ку заархивировать, сильно ли эта вещь будет больше оригинальной картинки. И прям так интересно стало, что пришлось скрипт писать. Больше делать нечего было и довольно долго. А тут хоть чем-то заняться можно.
Кстати, скажу сразу, что архив xmlки получился меньше, оригинальной бмпшки))
Если кому еще захочется пострадать ерундой, вот это творчество. CODE ( text):
скопировать код в буфер обмена
imagecreatefromBMP($filename) - аналог существующих функций imagecreatefrom***, только создает из bmp файла. img2xml(string $file, bool $rgb); $file - путь или URL к картинке; $rgb - когда true, цвет разлагается на rgb, когда false - нет. Тип картинки определится сам. xml2img(string $file, string $type); - type - тип картинки. jpg/gif/png/wbmp xml_output($file); - вывод картинки в браузер точками. Не знаю, зачем я это делал, как, в прочем, и всё остальное.
Вот оно:
PHP:
скопировать код в буфер обмена
<?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'); // с большими картинками не стоит эксперементировать ?>
|