View difference between Paste ID: LJcTUzGr and KCEi9vff
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
?>