Имеем изображение с тайловой структурой (например, спутниковый снимок). Структура, в которой хранится изображение, выглядит так: 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