Что нового

Удаление краевых тайлов

Papazol

Новичок
Сообщения
16
Репутация
1
Имеем изображение с тайловой структурой (например, спутниковый снимок). Структура, в которой хранится изображение, выглядит так: C:\...\z\y\x.jpg, где z - масштаб, y - положение тайла по вертикали, x - положение тайла по горизонтали. X увеличивается слева направо, y - сверху вниз.
Задача: удалить все тайлы (на одном масштабе), находящиеся на краях изображения, внутри ничего не затрагивая. При этом нужно учесть, что форма изображения может не быть прямоугольной.


Вот что у меня получилось:
Код:
$Files = _FileDirList ( $SourceFolder & '\' & $Zoom, "*.png", 0, 1 )	; создаём список файлов в папке
		 If $Files = 0 Then	; если функция возвратила "0"
			MsgBox ( 64, 'Удаление краевых тайлов', 'В указанной папке нет нужных файлов.' )
			Exit
		 EndIf

		 $FirstFile = $Files[1]
		 $Y0 = _StringBetween ( $FirstFile, $Zoom & '\', '\' )	; между Zoom\ и \ - это Y
		 $X0 = _StringBetween ( $FirstFile, $Y0[0] & '\', '.png' )	; между Y и расширением - это X
		 
		 $X = $X0[0]	; начальные значения
		 $Y = $Y0[0]	; X и Y

		 $Counter = 0	; обнуляем счётчик
		 $Test = 0
		 
While 1

	FileDelete ( $SourceFolder & '\' & $Zoom & '\' & $Y & '\' & $X & '.png' )	; удаляем текущий тайл
	$Counter += 1																; отсчитываем
			
	If $X = $X0[0] And $Y = $Y0[0] + 1 Then	ExitLoop	; условие окончания работы - 
														; если текущий тайл находится ПОД самым первым тайлом
	$A = _TilesTest ( $X, $Y )							; условие не выполняется - тестируем текущий тайл

	Select
	Case $Test = 4 Or $Test = 6 Or $Test = 7
	   $X += 1											; переходим к тайлу,
	   $Y = $Y											; расположенному СПРАВА от удалённого

	Case $Test = 2 Or $Test = 3 Or $Test = 11
	   $X = $X											; переходим к тайлу,
	   $Y += 1											; расположенному СНИЗУ от удалённого

	Case $Test = 1 Or $Test = 9 Or $Test = 13
	   $X -= 1											; переходим к тайлу,
	   $Y = $Y											; расположенному СЛЕВА от удалённого

	Case $Test = 8 Or $Test = 12 Or $Test = 14
	   $X = $X											; переходим к тайлу,
	   $Y -= 1											; расположенному СВЕРХУ от удалённого

	Case $Test = 5 Or $Test = 10 Or $Test = 15			; недопустимая комбинация
	   MsgBox ( 64, 'Удаление краевых тайлов', 'Произошла ошибка, программа закрывается.' )
	   Exit
	EndSelect
WEnd
		 
MsgBox ( 64, 'Удаление краевых тайлов', '"Работа завершена.' & @CRLF & "Удалено " & $Counter & " тайлов." )
Exit		 

Func _TilesTest ( $sX, $sY )
   $One   = 1 * FileExists ( $SourceFolder & '\' & $Zoom & '\' & $sY     & '\' & $sX - 1 & '.png' )	; проверяем наличие тайла НАД текущим
   $Two   = 2 * FileExists ( $SourceFolder & '\' & $Zoom & '\' & $sY + 1 & '\' & $sX     & '.png' )	; проверяем наличие тайла СПРАВА от текущего
   $Three = 4 * FileExists ( $SourceFolder & '\' & $Zoom & '\' & $sY     & '\' & $sX + 1 & '.png' )	; проверяем наличие тайла ПОД текущим
   $Four  = 8 * FileExists ( $SourceFolder & '\' & $Zoom & '\' & $sY - 1 & '\' & $sX     & '.png' )	; проверяем наличие тайла СЛЕВА от текущего
		 
   $Test = $One + $Two + $Three + $Four	; складываем полученные результаты
   Return $Test
EndFunc
 
Верх