Войти

Показать полную графическую версию : [решено] Нужен счётчик с лидирующими нулями


hp1nt0
27-12-2016, 16:37
Здравствуйте, я делаю ватермарки на gif изображения.
Код выглядит так:
REM ### PROCCESS ANIMATION START ###
set FileNumbA=0
for %%e in ("%SequenceFolder%/*.png") do ( set /a FileNumbA+=1 )
echo Number files in directory %FileNumbA%
REM ### PROCCESS ANIMATION START ###
setlocal enableextensions enabledelayedexpansion
set /a "FrameNumber=01"
for %%f in ( "%SequenceFolder%\*.png" ) do (
.\..\bin\magick -size 100x14 xc:none -gravity center ^
-stroke black -strokewidth 2 -annotate 0 "!FrameNumber! of %FileNumbA%" ^
-background none -shadow 100x3+0+0 +repage ^
-stroke none -fill white -annotate 0 "!FrameNumber! of %FileNumbA%" ^
%%f +swap -gravity southwest -geometry +0-3 ^
-composite .\img\1seq\%%~nxf
set /a "FrameNumber+=01"
)
REM ### PROCCESS ANIMATION START ###
for %%g in ( ".\img\1seq\*.png" ) do (
.\..\bin\magick -size 100x14 xc:none -gravity center ^
-stroke black -strokewidth 2 -annotate 0 "%WatermarkText%" ^
-background none -shadow 100x3+0+0 +repage ^
-stroke none -fill white -annotate 0 "%WatermarkText%" ^
%%g +swap -gravity southeast -geometry +0-3 ^
-composite .\img\2seq\%%~nxg )

Логика следующая: берём папку в которой лежат картинки.png
Считаем общее количество картинок
и начинаем на каждую по очереди наносить ватермарк.
В конце серию картинок преобразуем в gif.
Выглядит примерно так:
http://i.imgur.com/7hIrlFk.gif
Как можно видеть, слева при переходе с 9 до 10 изображение прыгает туда-сюда.
Был бы рад подсказке как сделать что бы переменная !FrameNumber! предварялась нулём
если в папке менее 100 изображений и двумя нулями если изображений более 100.
то есть 01 / 02 / 03 и т.д.
и 001 / 002 / 003 и т.д.

alpap
27-12-2016, 17:55
@echo off
setlocal enabledelayedexpansion
for /l %%a in (1 1 3) do set/a FrameNumbe+=1& set "m=00!FrameNumbe!"& set "FrameNumbe=!m:~-3!"& echo !FrameNumbe!
pause

просто пример, прикручивайте сами.

hp1nt0
27-12-2016, 18:30
alpap, спасибо но по моему это не работает.
Смотрите я поменял 3 на 12
echo off
setlocal enabledelayedexpansion
for /l %%a in (1 1 12) do set/a FrameNumbe+=1& set "m=00!FrameNumbe!"& set "FrameNumbe=!m:~-3!"& echo !FrameNumbe!
pause
и запустил:
001
002
003
004
005
006
007
008
001
002
003
004
счётчик считает до восьми и потом обнуляется.
и главное я вроде все команды понимаю а результат непредсказуем.

Iska
27-12-2016, 18:41
и главное я вроде все команды понимаю а результат непредсказуем. »
Для командного процессора числа, начинающиеся с «0», являются восьмеричными :). Не оно (в коде не разбирался)? Не оно, 8 — уже не оно.

hp1nt0, упакуйте исходники картинок и watermark в архив, и выложите на Яндекс.Диск или RGhost, дабы было с чем «играться».

hp1nt0
27-12-2016, 19:16
Iska, уже заливаю. Только одно но, я работаю с множеством проектов одновременно
поэтому у меня всё в одной папке включая исполняемые файлы (hard links. you know:) ).
Преимущество в том что можно не заморачиваться с инструкциями по установке софта.
Минус в размере "дистрибутива". Я архивировал в рар5 и получилось 10мб. Вроде не много.
Запустите единственный батник. Появится окно выбора папки. Надо выбрать папку OriginalDumpedFrames расположенную рядом с батничком.
Остальное может быть по умолчанию.
http://rgho.st/8lPcRzxCD
ЗЫ: Так как я копировал куски кода не проверяя то надо подкорректировать пути к magick
вместо .\..\bin\magick надо .\bin\magick

hp1nt0
27-12-2016, 20:06
Я нашёл пост
http://stackoverflow.com/questions/1192476/format-date-and-time-in-a-windows-batch-script
где человек решил подобную проблему. В сущности нужно IF
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
Только я не понимаю что с чем он сравнивает.

megaloman
27-12-2016, 23:54
hp1nt0, Я не вчитывался в Ваш код, но для счетчика с лидирующими нулями я делаю такую махинацию:
считаю не от 1 до N c шагом 1, а, например, от 1000001 до N+1000000 c шагом 1, а потом отрезаю лишние начальные позиции. Встроить этот счетчик к Вам в задачу не брался, не люблю копаться в чужих кодах.@Echo Off
cls

SetLocal EnableExtensions EnableDelayedExpansion

FOR /L %%i IN (1000001,1,1000012) DO Set "i00=%%i" &Echo !i00:~4,9999!
pause

hp1nt0
28-12-2016, 00:21
megaloman, спасибо. Это отличный способ.
Я "поиграюсь", посмотрю как применить.

alpap
28-12-2016, 03:17
но по моему это не работает »
все работает, переменная %FrameNumbe% уже записана в %m% и оперировать надо уже ей не переназначая иначе ее надо переоткрывать. Вот для 12ти:

echo off
setlocal enabledelayedexpansion
for /l %%a in (1 1 12) do set/a FrameNumbe+=1& set "m=00!FrameNumbe!"& echo !m:~-3!
pause

или то же самое, если привычнее уже свою переменную наблюдать на выходе:

echo off
setlocal enabledelayedexpansion
for /l %%a in (1 1 12) do set/a n+=1& set "FrameNumbe=00!n!"& echo !FrameNumbe:~-3!
pause

Iska
28-12-2016, 05:52
Угу. 1) считаем, 2) приписываем перед переменной потребное количество нулей, 3) вырезаем потребное количество разрядов справа.

hp1nt0
28-12-2016, 11:49
все работает, переменная %FrameNumbe% уже записана в %m% и оперировать надо уже ей »
Ааааа! Вот теперь я понял. Спасибо, похоже что это именно то что надо.

ЗЫ: Решено я на всякий случай пока не ставлю так как буду сидеть над скриптом через пару дней.
Вдруг возникнет потребность уточнить что либо. Хотя вроде проблем не ожидается.

hp1nt0
28-12-2016, 16:04
setlocal enableextensions enabledelayedexpansion
for %%f in ( "%SequenceFolder%\*.png" ) do (
set/a FrameNumber+=1& set "FrameDigits=00!FrameNumber!"
.\bin\magick -size 100x14 xc:none -gravity center ^
-stroke black -strokewidth 2 -annotate 0 "!FrameDigits:~-3! of %FileNumbA%" ^
-background none -shadow 100x3+0+0 +repage ^
-stroke none -fill white -annotate 0 "!FrameDigits:~-3! of %FileNumbA%" ^
%%f +swap -gravity southwest -geometry +0-3 ^
-composite .\img\1seq\%%~nxf
set "!FrameDigits:~-3!=FrameNumber"
)
Так работает.

hp1nt0
28-12-2016, 17:51
Всем спасибо. Способ предложенный alpap решил проблему.
За что ему отдельное спасибо.
Финальный код не факт что каноничен но главное - работает.
setlocal enableextensions enabledelayedexpansion
set /a LeadDigits=0
set /a Cutter=2
if %FileNumbA% GEQ 100 set "LeadDigits=00"& set "Cutter=3"
for %%f in ( "%SequenceFolder%\*.png" ) do (
set/a FrameNumber+=1& set "FrameDigits=%LeadDigits%!FrameNumber!"
.\bin\magick -size 100x14 xc:none -gravity center ^
-stroke black -strokewidth 2 -annotate 0 "!FrameDigits:~-%Cutter%! of %FileNumbA%" ^
-background none -shadow 100x3+0+0 +repage ^
-stroke none -fill white -annotate 0 "!FrameDigits:~-%Cutter%! of %FileNumbA%" ^
%%f +swap -gravity southwest -geometry +0-3 ^
-composite .\img\1seq\%%~nxf
set "!FrameDigits:~-3!=FrameNumber"
)




© OSzone.net 2001-2012