Пакетная обработка картинок

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
sergiokapone
Сообщения: 99
Зарегистрирован: Ср ноя 18, 2009 17:53

Пакетная обработка картинок

Сообщение sergiokapone »

Есть батник

Код: Выделить всё

tifftopnm foreground.tif | pnmtodjvurle > foreground.rle
tifftopnm background.tif > background.ppm
copy /b foreground.rle+background.ppm output.sep
csepdjvu output.sep demo.djvu
pause
который обрабатывает утилитами tifftopnm, pnmtodjvurle и csepdjvu исходные файлы foreground.tif и background.tif в один файл demo.djvu. Как написать скрипт для пакетной обработки файлов в TC, которые находятся в определенной папке? Т.е., например, имеется папка с файлами foreground0001.tif ... foreground1000.tif , background0001.tif ... background1000.tif нужно перегнать по вышеприведенной схеме файлы в demo0001.djvu ... demo1000.djvu
Последний раз редактировалось sergiokapone Сб июн 11, 2011 12:19, всего редактировалось 2 раза.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

sergiokapone писал(а):Т.е., например, имеется папка с файлами foreground0001.tif ... foreground1000.tif , нужно перегнать по вышеприведенной схеме файлы в demo0001.djvu ... demo1000.djvu
Я абсолютно не в курсе, как работают описанные утилиты (мне это не требуется), но где в приведённом примере файлы background*.tif? Они не будут использоваться?
Нет, я не сплю. Я просто медленно моргаю.
sergiokapone
Сообщения: 99
Зарегистрирован: Ср ноя 18, 2009 17:53

Сообщение sergiokapone »

Batya писал(а):но где в приведённом примере файлы background*.tif? Они не будут использоваться?
Извините, просто забыл написать, они тоже должны лежать в той же папке, что и foreground*.tif
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

sergiokapone
Соответственно, все описанные файлы группируются по номерам после базовых имён "foreground", "background" и "demo"?
Нет, я не сплю. Я просто медленно моргаю.
sergiokapone
Сообщения: 99
Зарегистрирован: Ср ноя 18, 2009 17:53

Сообщение sergiokapone »

Да, верно.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

sergiokapone
Т.к., ещё раз повторю, указанных выше утилит у меня нет, приводимый vbs-скрипт мной не тетировался. Пиши об ошибках.
Скрипт работает по выделенным файлам или папкам или по текущим под курсором. Имена можно задать через параметры или будут использоваться значения по-умолчанию.

Код: Выделить всё

'=====================================================================
' Пакетное формирование djvu-файлов
'
' Параметры:
' {файл-список} [{целевое имя файла} [{имя файла 1} [{имя файла 2}]]]
'
' Примеры параметров при вызове из TC:
' %L
' %L "demo"
' %L "demo" "foreground" "background"
'=====================================================================
Option Explicit
'======== Изменяемые параметры =======================================
Const Util1         = "tifftopnm"
Const Util2         = "pnmtodjvurle"
Const Util3         = "csepdjvu"
Const DefBaseName1  = "foreground"
Const DefBaseName2  = "background"
Const DefTargetName = "demo"
Const BaseExt1      = "tif"
Const BaseExt2      = "tif"
Const TargetExt     = "djvu"
Const TransitFile1  = "foreground.rle"
Const TransitFile2  = "background.ppm"
Const TransitFile3  = "output.sep"
'=====================================================================
Dim FSO, WSH, FF, F, BaseName1, BaseName2, TargetName

With WScript
  If .Arguments.Count = 0 Then
    MsgBox "Не заданы параметры!", vbOKOnly + vbCritical, "Пакетное формирование djvu-файлов"
    .Quit
  End If
  FF = .Arguments(0)
  If .Arguments.Count > 1 Then
    TargetName = .Arguments(1)
    If TargetName = "" Then TargetName = DefTargetName
  Else
    TargetName = DefTargetName
  End If
  If .Arguments.Count > 2 Then
    BaseName1 = .Arguments(2)
    If BaseName1 = "" Then BaseName1 = DefBaseName1
  Else
    BaseName1 = DefBaseName1
  End If
  If .Arguments.Count > 3 Then
    BaseName2 = .Arguments(3)
    If BaseName2 = "" Then BaseName2 = DefBaseName2
  Else
    BaseName2 = DefBaseName2
  End If
End With

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")

With FSO.OpenTextFile(FF, 1)
  Do While Not .AtEndOfStream
    F = Trim(.ReadLine)
    If F <> "" Then
      If FSO.FolderExists(F) Then ForFolder FSO.GetFolder(F)
      If FSO.FileExists(F)   Then ForFile   FSO.GetFile(F)
    End If
  Loop
  .Close
End With

Set FSO = Nothing
Set WSH = Nothing
WScript.Quit

Sub ForFile(pFile)
  Dim lAdd, lFile1, lFile2
  If InStr(1, pFile.Name, BaseName1, 1) = 1 And LCase(FSO.GetExtensionName(pFile.Name)) = BaseExt1 Then
    lAdd   = Mid(FSO.GetBaseName(pFile.Name), Len(BaseName1) + 1)
    lFile1 = BaseName2  & lAdd & "." & BaseExt2
    lFile2 = TargetName & lAdd & "." & TargetExt
    If FSO.FileExists(pFile.ParentFolder.Path & "\" & lFile1) Then
      WSH.Run "cmd /c " & Util1 & " " & pFile.Name & " | " & Util2  & " > " & TransitFile1, 7, True
      WSH.Run "cmd /c " & Util1 & " " & lFile1                      & " > " & TransitFile2, 7, True
      WSH.Run "cmd /c copy /b " & TransitFile1 & "+" & TransitFile2 &   " " & TransitFile3, 7, True
      WSH.Run "cmd /c " & Util3 & " " & TransitFile3 & " " & lFile2                       , 7, True
    End If
  End If
End Sub

Sub ForFolder(pFolder)
  Dim lF
  For Each lF In pFolder.Files
    ForFile lF
  Next
  For Each lF In pFolder.SubFolders
    ForFolder lF
  Next
End Sub
Последний раз редактировалось Batya Вс июн 12, 2011 01:13, всего редактировалось 1 раз.
Нет, я не сплю. Я просто медленно моргаю.
sergiokapone
Сообщения: 99
Зарегистрирован: Ср ноя 18, 2009 17:53

Сообщение sergiokapone »

Спасибо, за помощь. У меня пока не получилось, т.е. на выходе djvu не создался, но сообщений об ошибках тоже не выдает. Сам пакет утилит можно взять с этой страницы (Пакет утилит для работы метода разделённых сканов (474 КБ) (На базе csepdjvu и NetPBM-утилит)), там же я и увидел этот батник.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

sergiokapone писал(а):У меня пока не получилось, т.е. на выходе djvu не создался, но сообщений об ошибках тоже не выдает.
Нашёл ошибку в скрипте - в 76-ой строке должно быть

Код: Выделить всё

Len(BaseName1) + 1
Исправил.
Нет, я не сплю. Я просто медленно моргаю.
sergiokapone
Сообщения: 99
Зарегистрирован: Ср ноя 18, 2009 17:53

Сообщение sergiokapone »

Спасибо, работает
Ответить