Страница 1 из 1

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

Добавлено: Пт июн 10, 2011 23:02
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

Добавлено: Сб июн 11, 2011 10:39
Batya
sergiokapone писал(а):Т.е., например, имеется папка с файлами foreground0001.tif ... foreground1000.tif , нужно перегнать по вышеприведенной схеме файлы в demo0001.djvu ... demo1000.djvu
Я абсолютно не в курсе, как работают описанные утилиты (мне это не требуется), но где в приведённом примере файлы background*.tif? Они не будут использоваться?

Добавлено: Сб июн 11, 2011 12:14
sergiokapone
Batya писал(а):но где в приведённом примере файлы background*.tif? Они не будут использоваться?
Извините, просто забыл написать, они тоже должны лежать в той же папке, что и foreground*.tif

Добавлено: Сб июн 11, 2011 12:27
Batya
sergiokapone
Соответственно, все описанные файлы группируются по номерам после базовых имён "foreground", "background" и "demo"?

Добавлено: Сб июн 11, 2011 12:45
sergiokapone
Да, верно.

Добавлено: Сб июн 11, 2011 14:21
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

Добавлено: Сб июн 11, 2011 14:39
sergiokapone
Спасибо, за помощь. У меня пока не получилось, т.е. на выходе djvu не создался, но сообщений об ошибках тоже не выдает. Сам пакет утилит можно взять с этой страницы (Пакет утилит для работы метода разделённых сканов (474 КБ) (На базе csepdjvu и NetPBM-утилит)), там же я и увидел этот батник.

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

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

Len(BaseName1) + 1
Исправил.

Добавлено: Чт июн 16, 2011 23:23
sergiokapone
Спасибо, работает