Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Нужен счётчик с лидирующими нулями (http://forum.oszone.net/showthread.php?t=322102)

hp1nt0 27-12-2016 16:37 2698771

Нужен счётчик с лидирующими нулями
 
Здравствуйте, я делаю ватермарки на 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.
Выглядит примерно так:

Как можно видеть, слева при переходе с 9 до 10 изображение прыгает туда-сюда.
Был бы рад подсказке как сделать что бы переменная !FrameNumber! предварялась нулём
если в папке менее 100 изображений и двумя нулями если изображений более 100.
то есть 01 / 02 / 03 и т.д.
и 001 / 002 / 003 и т.д.

alpap 27-12-2016 17:55 2698794

Код:

@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 2698818

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 2698822

Цитата:

Цитата hp1nt0
и главное я вроде все команды понимаю а результат непредсказуем. »

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

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

hp1nt0 27-12-2016 19:16 2698833

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

.\..\bin\magick
надо
Код:

.\bin\magick

hp1nt0 27-12-2016 20:06 2698852

Я нашёл пост
http://stackoverflow.com/questions/1...s-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 2698893

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 2698899

megaloman, спасибо. Это отличный способ.
Я "поиграюсь", посмотрю как применить.

alpap 28-12-2016 03:17 2698913

Цитата:

Цитата hp1nt0
но по моему это не работает »

все работает, переменная %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 2698920

Угу. 1) считаем, 2) приписываем перед переменной потребное количество нулей, 3) вырезаем потребное количество разрядов справа.

hp1nt0 28-12-2016 11:49 2698974

Цитата:

Цитата alpap
все работает, переменная %FrameNumbe% уже записана в %m% и оперировать надо уже ей »

Ааааа! Вот теперь я понял. Спасибо, похоже что это именно то что надо.

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

hp1nt0 28-12-2016 16:04 2699090

Код:

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 2699152

Всем спасибо. Способ предложенный 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"
)



Время: 19:12.

Время: 19:12.
© OSzone.net 2001-