Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Преобразование картинки в XML))

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Champion Супермодератор
Отправлено: 13 Августа, 2009 - 12:26:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Читал я как-то bash.org.ru n наткнулся там на мудрую мысль. Мудрая мысль изображала как выглядела бы картинка, если ее конвертнуть в xml. По пикселям.
После небольшого раздумья мне стало интересно, а если эту xml-ку заархивировать, сильно ли эта вещь будет больше оригинальной картинки. И прям так интересно стало, что пришлось скрипт писать. Больше делать нечего было и довольно долго. А тут хоть чем-то заняться можно.
Кстати, скажу сразу, что архив xmlки получился меньше, оригинальной бмпшки))

Если кому еще захочется пострадать ерундой, вот это творчество.
CODE (text):
скопировать код в буфер обмена
  1. imagecreatefromBMP($filename) - аналог существующих функций imagecreatefrom***, только создает из bmp файла.
  2.  img2xml(string $file, bool $rgb); $file - путь  или URL к картинке; $rgb - когда true, цвет разлагается на rgb, когда false - нет. Тип картинки определится сам.
  3.  xml2img(string $file, string $type); - type - тип картинки. jpg/gif/png/wbmp
  4.  xml_output($file); - вывод картинки в браузер точками. Не знаю, зачем я это делал, как, в прочем, и всё остальное.

Вот оно:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. function imagecreatefromBMP($filename)
  5. { /*http://ru2.php.net/manual/en/function.imagecreate.php#53879*/
  6.    if (! $f1 = fopen($filename,"rb")) return FALSE;
  7.  
  8.    $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
  9.    if ($FILE['file_type'] != 19778) return FALSE;
  10.  
  11.    $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
  12.                  '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
  13.                  '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
  14.    $BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
  15.    if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
  16.    $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
  17.    $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
  18.    $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
  19.    $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
  20.    $BMP['decal'] = 4-(4*$BMP['decal']);
  21.    if ($BMP['decal'] == 4) $BMP['decal'] = 0;
  22.  
  23.    $PALETTE = array();
  24.    if ($BMP['colors'] < 16777216)
  25.    {
  26.     $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
  27.    }
  28.  
  29.    $IMG = fread($f1,$BMP['size_bitmap']);
  30.    $VIDE = chr(0);
  31.  
  32.    $res = imagecreatetruecolor($BMP['width'],$BMP['height']);
  33.    $P = 0;
  34.    $Y = $BMP['height']-1;
  35.    while ($Y >= 0)
  36.    {
  37.     $X=0;
  38.     while ($X < $BMP['width'])
  39.     {
  40.      if ($BMP['bits_per_pixel'] == 24)
  41.         $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
  42.      elseif ($BMP['bits_per_pixel'] == 16)
  43.      {
  44.         $COLOR = unpack("n",substr($IMG,$P,2));
  45.         $COLOR[1] = $PALETTE[$COLOR[1]+1];
  46.      }
  47.      elseif ($BMP['bits_per_pixel'] == 8)
  48.      {
  49.         $COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
  50.         $COLOR[1] = $PALETTE[$COLOR[1]+1];
  51.      }
  52.      elseif ($BMP['bits_per_pixel'] == 4)
  53.      {
  54.         $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
  55.         if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
  56.         $COLOR[1] = $PALETTE[$COLOR[1]+1];
  57.      }
  58.      elseif ($BMP['bits_per_pixel'] == 1)
  59.      {
  60.         $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
  61.         if     (($P*8)%8 == 0) $COLOR[1] =  $COLOR[1]        >>7;
  62.         elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
  63.         elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
  64.         elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
  65.         elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
  66.         elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
  67.         elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
  68.         elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
  69.         $COLOR[1] = $PALETTE[$COLOR[1]+1];
  70.      }
  71.      else
  72.         return FALSE;
  73.      imagesetpixel($res,$X,$Y,$COLOR[1]);
  74.      $X++;
  75.      $P += $BMP['bytes_per_pixel'];
  76.     }
  77.     $Y--;
  78.     $P+=$BMP['decal'];
  79.    }
  80.  
  81.    fclose($f1);
  82.  
  83.  return $res;
  84. }
  85.  
  86. /********************************************************************/
  87. /*Преобразует картинку в XML                                                                                */
  88. /********************************************************************/
  89. function img2xml($imgpath, $rgb = false)
  90. {
  91.         $img = @imagecreatefromjpeg($imgpath) or
  92.         $img = @imagecreatefrompng($imgpath) or
  93.         $img = @imagecreatefromwbmp($imgpath) or
  94.         $img = @imagecreatefromgif($imgpath) or
  95.         $img = @imagecreatefromBMP($imgpath);
  96.         if (!$img) return -1;
  97.        
  98.         $xml = fopen($imgpath.'.xml', 'w');
  99.         if (!$xml) return -2;
  100.        
  101.         $width = imagesx($img);
  102.         $height = imagesy($img);
  103.         fputs($xml, "<img w='$width' h='$height' rgb='$rgb'>\n");
  104.         if ($rgb)
  105.                 for ($y = 0; $y < $height; $y++)
  106.                         for ($x = 0; $x < $width; $x++) {
  107.                                 $color = imagecolorat($img, $x, $y);
  108.                                 $r = ($color >> 16) & 0xFF;
  109.                                 $g = ($color >> 8) & 0xFF;
  110.                                 $b = $color & 0xFF;
  111.                                 fputs($xml, "<pixel> <r>$r</r> <g>$g</g> <b>$b</b> </pixel>\n");
  112.                         }
  113.         else for ($y = 0; $y < $height; $y++)
  114.                         for ($x = 0; $x < $width; $x++) {
  115.                                 $color = dechex(imagecolorat($img, $x, $y));
  116.                                 fputs($xml, "<pixel>$color</pixel>\n");
  117.                         }
  118.         fputs($xml, "</img>");
  119.         fclose($xml);
  120.         return 1;
  121. }
  122.  
  123. /********************************************************************/
  124. /* Преобразует XML  в картинку                                                                              */
  125. /********************************************************************/
  126. function xml2img($xmlpath, $type = 'jpeg')
  127. {
  128.         $xml = fopen($xmlpath, 'r');
  129.         if (!$xml) return -1;
  130.        
  131.         $line = fgets($xml);
  132.         preg_match('/w\=\'(\d+)\'\sh\=\'(\d+)\'\srgb\=\'(\w*)\'/', $line, $matches);
  133.         $width = $matches[1]; $height = $matches[2]; $rgb = $matches[3];
  134.         $img = imagecreatetruecolor($width, $height);
  135.        
  136.         if (!$rgb)
  137.                 for ($y = 0; $y < $height; $y++)
  138.                         for ($x = 0; $x < $width; $x++) {
  139.                                 $line = fgets($xml);
  140.                                 preg_match('/\>(\w+)\</', $line, $matches);
  141.                                 $color = hexdec($matches[1]);
  142.                                 imagesetpixel($img, $x, $y, $color);
  143.                         }
  144.         else for ($y = 0; $y < $height; $y++)
  145.                         for ($x = 0; $x < $width; $x++) {
  146.                                 $line = fgets($xml);
  147.                                 preg_match('/r\>(\w+)\<\/r\>\s\<g\>(\w+)\<\/g\>\s\<b\>(\w+)\</', $line, $matches);
  148.                                 $r = $matches[1]; $g = $matches[2]; $b = $matches[3];
  149.                                 $color = imagecolorallocate($img, $r, $g, $b);
  150.                                 imagesetpixel($img, $x, $y, $color);
  151.                         }
  152.  
  153.         switch (strtoupper($type)) {
  154.                 case 'GIF': imagegif($img, $xmlpath.'.gif'); break;
  155.                 case 'PNG': imagepng($img, $xmlpath.'.png'); break;
  156.                 case 'WBMP': imagewbmp($img, $xmlpath.'.wbmp'); break;
  157.                 case 'JPEG':
  158.                 case 'JPG':
  159.                 default: imagejpeg($img, $xmlpath.'.jpeg'); ;
  160.         }
  161.        
  162.         return 1;
  163. }
  164.  
  165. /********************************************************************/
  166. /* Выводит картинку  в браузер точками ))                                                            */
  167. /* Не знаю зачем, но интересно. Только всё подвисает....                                  */
  168. /********************************************************************/
  169. function xml_output($xmlpath)
  170. {
  171.         $xml = fopen($xmlpath, 'r');
  172.         if (!$xml) return -1;
  173.        
  174.         $line = fgets($xml);
  175.         preg_match('/w\=\'(\w+)\'\sh\=\'(\w+)\'\srgb\=\'(\w*)\'/', $line, $matches);
  176.         $width = $matches[1]; $height = $matches[2]; $rgb = $matches[3];
  177.         $img = imagecreatetruecolor(1, 1);
  178.        
  179.         if (!$rgb)
  180.                 for ($y = 0; $y < $height; $y++) {
  181.                         for ($x = 0; $x < $width; $x++) {
  182.                                 $line = fgets($xml);
  183.                                 preg_match('/\>(\w+)\</', $line, $matches);
  184.                                 $color = hexdec($matches[0]);
  185.                                 $r = ($color >> 16) & 0xFF;
  186.                                 $g = ($color >> 8) & 0xFF;
  187.                                 $b = $color & 0xFF;
  188.                                 echo "<span style=' position: absolute; color: rgb($r, $g, $b); left: $x; top: $y'>.</span>";
  189.                         }
  190.                 }
  191.         else for ($y = 0; $y < $height; $y++) {
  192.                         for ($x = 0; $x < $width; $x++) {
  193.                                 $line = fgets($xml);
  194.                                 preg_match('/r\>(\w+)\<\/r\>\s\<g\>(\w+)\<\/g\>\s\<b\>(\w+)\</', $line, $matches);
  195.                                 $r = $matches[1]; $g = $matches[2]; $b = $matches[3];
  196.                                 echo "<span style='position: absolute; color: rgb($r, $g, $b); left: $x; top: $y'>.</span>";
  197.                         }
  198.                 }
  199.  
  200.        
  201.         return 1;
  202. }
  203.  
  204. $ix = img2xml('kartinka.bmp');
  205. switch ($ix) {
  206.         case -1: die('Не удается открыть картинку');
  207.         case -2: die('Не удается создать файл с результатом');
  208. }
  209. $xi = xml2img('kartinka.bmp.xml', 'jpeg');
  210. if ($xi == -1) die('Не удается открыть xml');  
  211. //echo xml_output('kartinka.bmp.xml'); // с большими картинками не стоит эксперементировать
  212.  
  213.  
  214. ?>
 
 Top
Roler
Отправлено: 13 Августа, 2009 - 12:29:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Это бы энергию да на благо Родины Улыбка
Я бы столько кода из-за интереса писать не стал Улыбка

Образец бы увидеть Улыбка Пойти что-ли, попробовать.
 
 Top
Champion Супермодератор
Отправлено: 13 Августа, 2009 - 12:47:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Roler, ну я не всё писал) imagecreatefromBMP пришлось поискать готовую))
 
 Top
Stierus Супермодератор
Отправлено: 13 Августа, 2009 - 15:09:57
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Ну выложи на хостинг демку что ли Улыбка Дай посмотреть, как картинка, прошедшая через xml_output в браузере выглядит Улыбка
 
My status
 Top
Champion Супермодератор
Отправлено: 13 Августа, 2009 - 15:15:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Stierus пишет:
Человек на 70% состоит из воды...
Кстати, эта задачка всё-таки на теорию множеств Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Наработки по собственным проектам »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB