Advertisement
Guest User

crop.php

a guest
May 1st, 2016
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3. $project = "some_file.scml";
  4. $ADD_SPACE = 1; //Добавить пустое пространство вокруг изображения (толщина).
  5.  
  6. if (!file_exists($project)) //В случае отсутствия файла проекта, необходимо его найти.
  7. {
  8.     //echo("Project_1 not found.\n");
  9.     $files = array();
  10.     $dirdata = scandir(".");
  11.     foreach ($dirdata as $key => $element) {
  12.         if (is_file($element)) {
  13.             $local_str_array = explode(".", $element);
  14.             if (end($local_str_array)=="scml")
  15.             {
  16.                 $files[] = $element;
  17.             }
  18.         }
  19.     }  
  20.     if (count($files)==0)
  21.     {
  22.         echo("ERROR: Project not found.\n");
  23.         die;
  24.     }
  25.     if (count($files)>1)
  26.     {
  27.         echo("ERROR: Two project files was found. Remove one of them.\n");
  28.         die;
  29.     }
  30.     $project = $files[0];
  31.     echo("Found project: ".$project."\n");
  32. }
  33.  
  34. $changed_flag = false;
  35.  
  36. function crop($filename,$new_filename,$pivot_x,$pivot_y)
  37. {
  38.     global $changed_flag,$ADD_SPACE;
  39.     //echo($pivot_x."\n");
  40.     if(!isset($pivot_x)||!isset($pivot_y))
  41.     {
  42.         echo("ERROR in crop($filename): no pivot points.");
  43.         return array(-100,-100,0,0);
  44.     }
  45.     $pivot_x = floatval($pivot_x);
  46.     $pivot_y = floatval($pivot_y);
  47.     //$filename = "headbase-0.png";
  48.     //echo('Image: '.$filename."\n");
  49.     $im = imagecreatefrompng($filename); //Загружаем картинку.
  50.     //echo('true color = '.imageistruecolor($im)."\n");
  51.     $size_x=imagesx($im); //Получаем размеры.
  52.     $size_y=imagesy($im);
  53.     //echo('Size = '.$x.';'.$y."\n");
  54.     imagesavealpha ( $im , true ); //Используем прозрачный канал?
  55.  
  56.     //Ищем границы. По умолчанию это границы самого изображения.
  57.     $x_low = 0;
  58.     $y_low = 0;
  59.     $x_top = $size_x;
  60.     $y_top = $size_y;
  61.     //Слева
  62.     $bool = true;
  63.     for($i=0;$i<$x_top;$i++)
  64.     {
  65.         for($j=0;$j<$y_top;$j++)
  66.         {
  67.             $rgb = imagecolorat($im, $i, $j);
  68.             $colors = imagecolorsforindex($im, $rgb);
  69.             if ($colors['alpha'] < 110)
  70.             {
  71.                 //echo("break");
  72.                 $bool = false;
  73.                 break;
  74.             }
  75.         }
  76.         if (!$bool) break;
  77.         $x_low++;
  78.     }
  79.     //Справа
  80.     $bool = true;
  81.     for($i=$x_top-1;$i>=$x_low;$i--)
  82.     {
  83.         for($j=0;$j<$y_top;$j++)
  84.         {
  85.             $rgb = imagecolorat($im, $i, $j);
  86.             $colors = imagecolorsforindex($im, $rgb);
  87.             if ($colors['alpha'] < 110)
  88.             {
  89.                 //echo("break");
  90.                 $bool = false;
  91.                 break;
  92.             }
  93.         }
  94.         if (!$bool) break;
  95.         $x_top--;
  96.     }
  97.     //Сверху (в рамках вырезанного)
  98.     $bool = true;
  99.     for($i=0;$i<$y_top;$i++)
  100.     {
  101.         for($j=$x_low;$j<$x_top;$j++)
  102.         {
  103.             $rgb = imagecolorat($im, $j, $i);
  104.             $colors = imagecolorsforindex($im, $rgb);
  105.             if ($colors['alpha'] < 110)
  106.             {
  107.                 //echo("break");
  108.                 $bool = false;
  109.                 break;
  110.             }
  111.         }
  112.         if (!$bool) break;
  113.         $y_low++;
  114.     }
  115.     //Снизу
  116.     $bool = true;
  117.     for($i=$y_top-1;$i>=$y_low;$i--)
  118.     {
  119.         for($j=$x_low;$j<$x_top;$j++)
  120.         {
  121.             $rgb = imagecolorat($im, $j, $i);
  122.             $colors = imagecolorsforindex($im, $rgb);
  123.             if ($colors['alpha'] < 110)
  124.             {
  125.                 //echo("break");
  126.                 $bool = false;
  127.                 break;
  128.             }
  129.         }
  130.         if (!$bool) break;
  131.         $y_top--;
  132.     }
  133.  
  134.     //echo("DEBUG: $x_low, $y_low, $x_top, $y_top, $size_x, $size_y\n");
  135.    
  136.     //Картинка не изменилась. Нечего обрезать. Выходим.
  137.     if ($x_low==$ADD_SPACE && $y_low==$ADD_SPACE && $x_top==$size_x-$ADD_SPACE && $y_top==$size_y-$ADD_SPACE)
  138.     {
  139.         return "SKIP";
  140.     }
  141.  
  142.  
  143.     if ($x_top==$x_low || $y_top ==$y_low) //Границы сдвинулись до нуля. Пустое изображение.
  144.     { //Если так, то нужно уменьшить пустые пространства до 2х2. При условии, что картинки больше.
  145.         if ($size_x == 2 && $size_y == 2)
  146.         {
  147.             //return array(-100,-100,0,0); //Уже дефолтный размер.
  148.             return "2x2";
  149.         }
  150.         $tc = imagecreatetruecolor(2,2);
  151.         imagesavealpha ( $tc , true );
  152.         $transp = imagecolorallocatealpha($tc, 255, 255, 255, 127);
  153.         imagefill($tc, 0, 0, $transp); //заливка прозрачным цветом
  154.         //imagecopy($tc, $im, $ADD_SPACE, $ADD_SPACE, $x_low, $y_low, $new_size_x-$ADD_SPACE*2, $new_size_y-$ADD_SPACE*2);
  155.         imagePNG($tc, $new_filename);
  156.         //echo("Done.\n");
  157.         $changed_flag = true;
  158.         return array(0.5,0.5, 2,2);
  159.     }
  160.    
  161.    
  162.    
  163.     //echo("OLD SIZE: $size_x, $size_y\n");
  164.  
  165.     //Новые размеры
  166.     $new_size_x = $x_top - $x_low + $ADD_SPACE*2;
  167.     $new_size_y = $y_top - $y_low + $ADD_SPACE*2;
  168.     //echo("NEW SIZE: $new_size_x, $new_size_y\n");
  169.    
  170.    
  171.     //Новые pivot координаты
  172.     //Важно: pivot_y считается снизу (зеркальное отражение?)
  173.     //echo("PIVOT_Y=$pivot_y\n");
  174.     //echo("OLD COORD: ".(((1-$pivot_y) * $size_y)." / $size_y\n"));
  175.     $pivot_coord_x = $pivot_x * $size_x - $x_low + $ADD_SPACE;
  176.     $pivot_coord_y = ((1-$pivot_y) * $size_y - $y_low + $ADD_SPACE);
  177.     //echo("NEW COORD: $pivot_coord_y / $new_size_y\n");
  178.     $new_pivot_x = $pivot_coord_x / $new_size_x;
  179.     $new_pivot_y = 1- ($pivot_coord_y / $new_size_y);
  180.     //echo("NEW_PIVOT=$new_pivot_y\n");
  181.    
  182.     //Создаем копию изображения
  183.     //echo("Writing...\n");
  184.     $tc = imagecreatetruecolor($new_size_x, $new_size_y);
  185.     imagesavealpha ( $tc , true );
  186.     $transp = imagecolorallocatealpha($tc, 255, 255, 255, 127);
  187.     imagefill($tc, 0, 0, $transp); //заливка прозрачным цветом
  188.     imagecopy($tc, $im, $ADD_SPACE, $ADD_SPACE, $x_low, $y_low, $new_size_x-$ADD_SPACE*2, $new_size_y-$ADD_SPACE*2);
  189.     imagePNG($tc, $new_filename);
  190.     //echo("Done.\n");
  191.     $changed_flag = true;
  192.     return array($new_pivot_x,$new_pivot_y,$new_size_x,$new_size_y);
  193. }
  194.  
  195.  
  196. /*
  197. $filename = "headbase/headbase-0.png";
  198. $new_filename = "headbase/image-2.png";
  199. $pivot_x = 0.520832;
  200. $pivot_y = 0.186585;
  201. list($new_px,$new_py) = crop($filename,$new_filename,$pivot_x,$pivot_y);
  202. echo("New pivots: $new_px, $new_py\n");
  203. */
  204.  
  205. function formatt($num)
  206. {
  207.     return sprintf('%.6F', $num);
  208. }
  209.  
  210.  
  211. $xml = simplexml_load_file($project);
  212.  
  213. echo($xml["scml_version"]."\n"); //1.0
  214. $folder = $xml->folder;
  215. for($f_num=0;$f_num<count($folder);$f_num++)
  216. {
  217.     print($folder[$f_num]["name"]."\n");
  218.     $files=$folder[$f_num]->file;
  219.     for($ff=0;$ff<count($files);$ff++)
  220.     {
  221.         //if ( $files[$ff]["name"] != "face/face-31.png") continue;
  222.         //print("Found pivot y = ".$files[$ff]["pivot_y"]."\n");
  223.         $result = crop($files[$ff]["name"],str_replace("/","\\",$files[$ff]["name"]),$files[$ff]["pivot_x"],$files[$ff]["pivot_y"]);
  224.            
  225.         if (gettype($result)=="string") //Ошибка. Файл не был изменен.
  226.         {
  227.             echo("\t".$files[$ff]["name"]." ".($result)."\n");
  228.             continue;
  229.         }
  230.        
  231.         list($new_px,$new_py,$width,$height) = $result;
  232.         $file_is_changed = !(empty($new_px)||$new_px==-100);
  233.         if ($file_is_changed)
  234.         {
  235.             if (!empty($new_px))
  236.             {
  237.                 $files[$ff]["pivot_x"] = formatt($new_px);
  238.                 $files[$ff]["pivot_y"] = formatt($new_py);
  239.             }
  240.             $files[$ff]["width"] = $width;
  241.             $files[$ff]["height"] = $height;
  242.         }
  243.         echo("\t".$files[$ff]["name"]." ".($new_px==-100?"ERROR":"")."\n");
  244.         //$files[$ff]["name"] = "HAHAHAHA";
  245.     }
  246. }
  247.  
  248. if ($changed_flag)
  249. {
  250.     echo("Writing...\n");
  251.     $xml->asXML($project);
  252. }
  253. else echo ("No changes.");
  254. echo("Done.\n");
  255. sleep(3);
  256.  
  257. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement