SHOW:
|
|
- or go back to the newest paste.
1 | <?php | |
2 | ||
3 | $project = "some_file.scml"; | |
4 | - | $ADD_SPACE = 2; //Добавить пустое пространство вокруг изображения (толщина). |
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 | ?> |