Компьютерный форум 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=291321)

Sisin 20-11-2014 15:07 2432579

Упрощение работы со сканером
 
Есть сканер Epson V37 и программа EPSON Scan.

Можно ли сделать так, чтобы в контекстном меню Создать был пункт Новый скан, при выборе которого в любом месте создавался бы скан с заложенными изначально настройками???
Как это можно реализовать на основе команд TWAIN??
Как считать команды, которые настроенный EPSON Scan передает сканеру???

Iska 20-11-2014 15:24 2432599

Цитата:

Цитата Sisin
Можно ли сделать так, чтобы в контекстном меню Создать был пункт Новый скан, при выборе которого в любом месте создавался бы скан с заложенными изначально настройками??? »

Можно попробовать.

Цитата:

Цитата Sisin
Как это можно реализовать на основе команд TWAIN?? »

Без понятия. А вот на основе WIA — вполне.

Цитата:

Цитата Sisin
Как считать команды, которые настроенный EPSON Scan передает сканеру??? »

Не представляю.

Посмотрите пример работы здесь: vbscript: сканирование с заданными параметрами — Коллекция скриптов и идей — Серый форум. Что скажете?

Sisin 20-11-2014 15:33 2432610

Цитата:

Цитата Iska
Что скажете? »

Спасибо, за направление...

А как в скрипте прописать правильно путь strPath2Save, чтобы скан создавался в той папке, из которой выбрали Создать - Новый скан???

Запускаю скрипт:
Код:

Option Explicit

Const ScannerDeviceType = 1
Const ColorIntent = 1
Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"


Dim objDeviceManager
Dim objDeviceInfos
Dim objDevice

Dim objImageFile
Dim objImageProcess

' Задаём характеристики изображения
Dim strPath2Save = "C:\MyImage.jpg"          ' Полное имя файла для сохранения
Dim strFormat = wiaFormatJPEG                ' Формат файла — *.jpg
Dim intQuality = 85                          ' Качество jpg
Dim intDPI = 150                              ' Разрешение — 150 dpi
Dim intHorizontalSize = (210 / 25.4) * intDPI ' Размер по горизонтали — A4
Dim intVerticalSize = (297 / 25.4) * intDPI  ' Размер по вертикали — A4

Set objDeviceManager = WScript.CreateObject("WIA.DeviceManager")
Set objDeviceInfos = objDeviceManager.DeviceInfos

If objDeviceInfos.Count > 0 Then
    ' Выбираем устройство для сканирования. Если оно единственное, то сие произойдёт без отображения диалога.
    Set objDevice = WScript.CreateObject("WIA.CommonDialog").ShowSelectDevice(ScannerDeviceType, False, False)
    ' Кроме того, зная DeviceID устройства, можно использовать иной способ подключения, например:
    'Dim objDeviceInfo
    '
    'For Each objDeviceInfo In objDeviceManager.DeviceInfos
    '    WScript.Echo objDeviceInfo.DeviceID
    '
    '    If objDeviceInfo.DeviceID = "{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0000" Then
    '        Set objDevice = objDeviceInfo.Connect
    '    End If
    'Next

    If Not objDevice Is Nothing Then
        WScript.Echo objDevice.Properties.Item("Name") & " [" & objDevice.DeviceID & "]"
        WScript.Echo "Scanning..."

        With objDevice
            With .Items(1)
                ' Задаём требуемые характеристики изображения для сканирования
                With .Properties
                    .Item("6146").Value = ColorIntent            ' Цветовая модель (Current Intent)

                    ' Разрешение…
                    .Item("6147").Value = intDPI                  ' …по горизонтали (Horizontal Resolution)
                    .Item("6148").Value = intDPI                  ' …по вертикали (Vertical Resolution)

                    ' Начало области сканирования…
                    .Item("6149").Value = 0                      ' …по горизонтали (Horizontal Start Position)
                    .Item("6150").Value = 0                      ' …по вертикали (Vertical Start Position)

                    ' Размер области сканирования…
                    .Item("6151").Value = intHorizontalSize      ' …по горизонтали (Horizontal Extent)
                    .Item("6152").Value = intVerticalSize        ' …по вертикали (Vertical Extent)
                End With

                ' Инициируем начало операции сканирования
                Set objImageFile = .Transfer()

                ' Конвертируем полученное изображение
                WScript.Echo "Converting..."

                Set objImageProcess = WScript.CreateObject("WIA.ImageProcess")

                With objImageProcess
                    With .Filters
                        .Add objImageProcess.FilterInfos("Convert").FilterID

                        With .Item(1).Properties
                            .Item("FormatID").Value = strFormat  ' Формат изображения
                            .Item("Quality").Value  = intQuality ' Качество изображения
                        End With
                    End With

                    Set objImageFile = .Apply(objImageFile)
                End With
            End With
        End With

        ' Если файл существует — предварительно удаляем его
        With WScript.CreateObject("Scripting.FileSystemObject")
            If .FileExists(strPath2Save) Then
                .DeleteFile strPath2Save
            End If
        End With

        ' Сохраняем полученное изображение
        objImageFile.SaveFile strPath2Save

        WScript.Echo "Complete."

        Set objDevice = Nothing
    Else
        WScript.Echo "Cancel scanning by user"
    End If
Else
    WScript.Echo "No connected devices"
End If

Set objDeviceManager = Nothing
Set objDeviceInfos  = Nothing

WScript.Quit 0

А в нем показывается ошибка в Dim strPath2Save = "C:\MyImage.jpg". Что не так????

Iska 21-11-2014 05:24 2432984

Цитата:

Цитата Sisin
А в нем показывается ошибка в Dim strPath2Save = "C:\MyImage.jpg". Что не так???? »

В VBScript объявление переменной не может одновременно использоваться для присвоения ей значения. Т.е., должно быть отдельно объявление переменной:
Код:

Dim strPath2Save
и отдельно — присвоение значения:
Код:

strPath2Save = "C:\MyImage.jpg"
Цитата:

Цитата Sisin
… чтобы скан создавался в той папке, из которой выбрали Создать - Новый скан??? »

Давайте попробуем.

Код WSH:
Скрытый текст
Код:

Option Explicit

Const ScannerDeviceType = 1
Const ColorIntent = 1
Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"


Dim strBaseName
Dim iCount

Dim objDeviceManager
Dim objDeviceInfos
Dim objDevice

Dim objImageFile
Dim objImageProcess

Dim strPath2Save
Dim strFormat
Dim intQuality
Dim intDPI
Dim intHorizontalSize
Dim intVerticalSize


If WScript.Arguments.Count = 1 Then
        strPath2Save = WScript.Arguments.Item(0)
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                iCount = 1
                strBaseName = .GetBaseName(strPath2Save)
               
                Do
                        If .FileExists(strPath2Save) Then
                                iCount = iCount + 1
                                strPath2Save = .BuildPath(.GetParentFolderName(strPath2Save), strBaseName & " (" & CStr(iCount) & ")." & .GetExtensionName(strPath2Save))
                        Else
                                Exit Do
                        End If
                Loop
        End With
       
        ' Задаём характеристики изображения
        strFormat        = wiaFormatJPEG        ' Формат файла — *.jpg
        intQuality        = 85                    ' Качество jpg
        intDPI            = 150                  ' Разрешение — 150 dpi
        intHorizontalSize = (210 / 25.4) * intDPI ' Размер по горизонтали — A4
        intVerticalSize  = (297 / 25.4) * intDPI ' Размер по вертикали — A4
       
       
        Set objDeviceManager = WScript.CreateObject("WIA.DeviceManager")
        Set objDeviceInfos = objDeviceManager.DeviceInfos
       
        If objDeviceInfos.Count > 0 Then
                ' Выбираем устройство для сканирования. Если оно единственное, то сие произойдёт без отображения диалога.
                Set objDevice = WScript.CreateObject("WIA.CommonDialog").ShowSelectDevice(ScannerDeviceType, False, False)
                ' Кроме того, зная DeviceID устройства, можно использовать иной способ подключения, например:
                'Dim objDeviceInfo
                '
                'For Each objDeviceInfo In objDeviceManager.DeviceInfos
                '    WScript.Echo objDeviceInfo.DeviceID
                '
                '    If objDeviceInfo.DeviceID = "{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0000" Then
                '        Set objDevice = objDeviceInfo.Connect
                '    End If
                'Next
               
                If Not objDevice Is Nothing Then
                        With objDevice
                                With .Items(1)
                                        ' Задаём требуемые характеристики изображения для сканирования
                                        With .Properties
                                                .Item("6146").Value = ColorIntent            ' Цветовая модель (Current Intent)
                                               
                                                ' Разрешение…
                                                .Item("6147").Value = intDPI                  ' …по горизонтали (Horizontal Resolution)
                                                .Item("6148").Value = intDPI                  ' …по вертикали (Vertical Resolution)
                                               
                                                ' Начало области сканирования…
                                                .Item("6149").Value = 0                      ' …по горизонтали (Horizontal Start Position)
                                                .Item("6150").Value = 0                      ' …по вертикали (Vertical Start Position)
                                               
                                                ' Размер области сканирования…
                                                .Item("6151").Value = intHorizontalSize      ' …по горизонтали (Horizontal Extent)
                                                .Item("6152").Value = intVerticalSize        ' …по вертикали (Vertical Extent)
                                        End With
                                       
                                        ' Инициируем начало операции сканирования
                                        Set objImageFile = .Transfer()
                                       
                                        ' Конвертируем полученное изображение
                                        Set objImageProcess = WScript.CreateObject("WIA.ImageProcess")
                                       
                                        With objImageProcess
                                                With .Filters
                                                        .Add objImageProcess.FilterInfos("Convert").FilterID
                                                       
                                                        With .Item(1).Properties
                                                                .Item("FormatID").Value = strFormat  ' Формат изображения
                                                                .Item("Quality").Value  = intQuality ' Качество изображения
                                                        End With
                                                End With
                                               
                                                Set objImageFile = .Apply(objImageFile)
                                        End With
                                End With
                        End With
                       
                        ' Сохраняем полученное изображение
                        objImageFile.SaveFile strPath2Save
                       
                        Set objDevice = Nothing
                Else
                        WScript.Echo "Cancel scanning by user"
                End If
        Else
                WScript.Echo "No connected devices"
        End If
       
        Set objDeviceManager = Nothing
        Set objDeviceInfos  = Nothing
Else
        WScript.Echo "This script can not be used directly."
        WScript.Quit 1
End If

WScript.Quit 0


Сохраните его в файл с именем, например, «My preset scan.vbs».

Далее:
Скрытый текст
  1. Обязательно сделайте резервную копию раздела «HKEY_CLASSES_ROOT\.jpg».
  2. Убедитесь, что параметр по умолчанию раздела «HKEY_CLASSES_ROOT\.jpg» содержит значение «jpegfile» (добавьте/измените, если параметр отсутствует/не содержит).
  3. Создайте в разделе «HKEY_CLASSES_ROOT\.jpg» раздел «ShellNew» (если его нет).
  4. Создайте в новосозданном разделе «HKEY_CLASSES_ROOT\.jpg\ShellNew» параметр «Command» типа «REG_SZ» («Строковый параметр»). Если раздел «ShellNew» существовал — предварительно удалите всё его содержимое (я надеюсь, Вы не забыли сделать резервную копию, как указано выше?).
  5. Присвойте ему значение вида:
    Код:

    "%SystemRoot%\system32\wscript.exe" "E:\Песочница\0409\My preset scan.vbs" "%1"
  6. где:
    • «%SystemRoot%\system32\wscript.exe» — путь к исполняемому файлу WSH;
    • «E:\Песочница\0409\My preset scan.vbs» — полный путь к файлу скрипта;
    • «%1» — передаваемый параметр, будет содержать путь и имя вида «Путь\Рисунок JPEG.jpg» («Рисунок JPEG» берётся из значения по умолчанию ассоциированного раздела «HKEY_CLASSES_ROOT\jpegfile», а расширение из раздела «HKEY_CLASSES_ROOT\.jpg»).

После этого можете пробовать пользоваться.

Sisin 21-11-2014 11:23 2433094

Спасибо, Iska

А можно как-нибудь сделать, чтобы в контектном меню был не "Рисунок JPEG", а "Скан"???

В программе Epson Scan есть опции настройки изображения: Повышение резкости, Удаление растра, Улучшение текста. Эти настройки можно реализовать на основе WIA команд или это просто сама программа делает???

Iska 21-11-2014 16:38 2433275

Цитата:

Цитата Sisin
А можно как-нибудь сделать, чтобы в контектном меню был не "Рисунок JPEG", а "Скан"??? »

Можно.

а) Заменив значение «Рисунок JPEG» в параметре по умолчанию раздела «HKEY_CLASSES_ROOT\jpegfile» на «Скан». Естественно, все .jpg с этого момента будут именно типа «Скан». Не рекомендую.

б) Создав своё уникальное расширение, свой привязанный к этому расширению уникальный тип, приписав которому в параметре по умолчанию значение «Скан» мы также можем добиться искомого. Но это уже излишние извращения, на мой взгляд.

Цитата:

Цитата Sisin
В программе Epson Scan есть опции настройки изображения: Повышение резкости, Удаление растра, Улучшение текста. Эти настройки можно реализовать на основе WIA команд или это просто сама программа делает??? »

Это делает само приложение. В WIA, конечно, есть небольшое количество фильтров, но для манипуляции именно самим изображением — масштабирование, вращение, отражение, обрезка, накладка… Теоретически, можно и самому написать фильтры в виде обработки вектора ARGB, которым может быть представлено изображение, но, как понимаете, это а) надо знать и понимать алгоритм, б) уметь перевести его на работу с вектором и в) в любом случае, скорость обработки подобного самопального фильтра на WSH будет дико удручающей.


Время: 14:05.

Время: 14:05.
© OSzone.net 2001-