Что нового

Работа со сканерами

artpluss

Новичок
Сообщения
21
Репутация
0
Версия AutoIt: 3.3.10.2

Описание: Помогите написать программу, которая будет работать со сканерами через TWAIN. Сканировать изображение и сохранять его в папку.

С возможностью:
1) Выбора настроек качества (150dpi 200dpi 300dpi 400dpi).
2) Выбора каталога сохранения изображений.
3) Выбора сканера, если их несколько и сохранением последнего выбранного (по умолчанию)
4) Выбора формата файла (PDF (многостраничный), JPEG)
5) Выбор цвета картинки (черно-белое, цветное)

Желательно, чтобы все настройки сохранялись в ini файл

Такой код имеется на данный момент:
Не знаю как сделать сканирование в JPEG и как избавиться от водяного знака внутри pdf файла после сканирования.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>

;~ #include <StaticConstants.au3>
;~ #include <WindowsConstants.au3>
;~ #Include <File.au3>

;~ #Include <String.au3>

If WinExists(@ScriptName) Then Exit
	AutoItWinSetTitle(@ScriptName)

opt("TrayIconHide", 1)

; переменные

$sVer="версия 14.03.12"
$iniFile="ScanPFR.ini"
$Exist=FileExists (@ScriptDir & "\" & $iniFile)
Global $Radio_CHECKED = IniRead($iniFile, "Main", "FileFormat", 1)
Global $Radio_Resolution = IniRead($iniFile, "Main", "Resolution", 200)
;~ MsgBox(262208,"Сообщение...", $Radio_Resolution)

$aYY=150
; Создать окно диалога для добавления управляющих элементов ...
$GUI=GUICreate("ScanPFR", 410, 83 + $aYY, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_GROUP, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))

GUICtrlCreateGroup("", 10, 13 + $aYY, 390, 60)
$Config = GUICtrlCreateButton("НАСТРОЙКИ", 25, 33 + $aYY, 100, 25)

$Exit = GUICtrlCreateButton("ВЫХОД", 285, 33 + $aYY, 100, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

GUICtrlCreateLabel("Сохранять в:", 10, 19, 70, 17)
$Save_As = GUICtrlCreateInput("C:\ScanPFR", 80, 16, 250, 21)
$Obzor = GUICtrlCreateButton("Выбрать", 335, 14, 65, 25)
GUICtrlCreateLabel("Имя файла:", 10, 49, 70, 17)
$Name_File = GUICtrlCreateInput("FileScan", 80, 46, 250, 21)
	If $Radio_CHECKED = 1 Then
	   $FormatScan = GUICtrlCreateLabel("PDF", 355, 49, 65, 21)
	Else
	   $FormatScan = GUICtrlCreateLabel("JPEG", 355, 49, 65, 21)
	EndIf

$Scaner = GUICtrlCreateButton("СКАНИРОВАТЬ", 10, 80, 390, 80)

While 1
   $msg = GUIGetMsg()
        Select
        Case $msg = -3 Or $msg = -1 Or $msg = $Exit Or $msg = $GUI_EVENT_CLOSE
            ExitLoop
		Case $msg = $Config
			_Settings_Dlg($GUI)
		Case $msg = $Obzor
			$Path_Obzor = FileSelectFolder("Выберете папку", "",3, "D:\9ПТККС\КС\")
				 If @error Then
                    ContinueLoop
                 EndIf
			GUICtrlSetData($Save_As, $Path_Obzor)
		 Case $msg = $Scaner
			 $Save_As1 = GUICtrlRead($Save_As)
			 $Name_File1 = GUICtrlRead($Name_File)
			 If FileExists($Save_As1) = 0 Then DirCreate( $Save_As1 )
			_TWAIN_Start($Save_As1, $Name_File1)
	  EndSelect
  WEnd



;~ Дочернее окно настроек
Func _Settings_Dlg($hParent = 0)
	Local $hSettings, $iGOEM_Opt

    ;Предотвращение проблем в случае если главный GUI использует режим событий
    $iGOEM_Opt = Opt("GUIOnEventMode", 0)
    $hSettings_GUI = GUICreate("Настройки", 360, 180, -1, -1, -1, -1, $hParent)

;~     $SaveBtn = GUICtrlCreateButton ("Сохранить", 50, 395, 170, 25) ; кн "Сохранить"
;~     $ExitSattingsBtn = GUICtrlCreateButton ("Выход", 230+10, 395, 170, 20+5) ; кн "Выход"

	GUICtrlCreateGroup("Формат файла:", 10, 5, 160, 50)


	If $Radio_CHECKED = 1 Then
    $PDF_Radio = GUICtrlCreateRadio("PDF", 35, 27, 50, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
	$JPEG_Radio = GUICtrlCreateRadio("JPEG", 95, 27, 50, 17)
	  Else
    $PDF_Radio = GUICtrlCreateRadio("PDF", 35, 27, 50, 17)
	$JPEG_Radio = GUICtrlCreateRadio("JPEG", 95, 27, 50, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
	EndIf


    GUICtrlCreateGroup("", -99, -99, 1, 1)
	GUICtrlCreateGroup("Качество:", 10, 60, 160, 75)

		If $Radio_Resolution = 150 Then
    $150_Radio = GUICtrlCreateRadio("150 dpi", 35, 80, 55, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
	$200_Radio = GUICtrlCreateRadio("200 dpi", 95, 80, 55, 17)
	$300_Radio = GUICtrlCreateRadio("300 dpi", 35, 110, 55, 17)
	$400_Radio = GUICtrlCreateRadio("400 dpi", 95, 110, 55, 17)
	  Else
		If $Radio_Resolution = 200 Then
    $150_Radio = GUICtrlCreateRadio("150 dpi", 35, 80, 55, 17)
	$200_Radio = GUICtrlCreateRadio("200 dpi", 95, 80, 55, 17)
	    GUICtrlSetState(-1, $GUI_CHECKED)
	$300_Radio = GUICtrlCreateRadio("300 dpi", 35, 110, 55, 17)
	$400_Radio = GUICtrlCreateRadio("400 dpi", 95, 110, 55, 17)
	  Else
		If $Radio_Resolution = 300 Then
    $150_Radio = GUICtrlCreateRadio("150 dpi", 35, 80, 55, 17)
	$200_Radio = GUICtrlCreateRadio("200 dpi", 95, 80, 55, 17)
	$300_Radio = GUICtrlCreateRadio("300 dpi", 35, 110, 55, 17)
		GUICtrlSetState(-1, $GUI_CHECKED)
	$400_Radio = GUICtrlCreateRadio("400 dpi", 95, 110, 55, 17)
	  Else
		If $Radio_Resolution = 400 Then
    $150_Radio = GUICtrlCreateRadio("150 dpi", 35, 80, 55, 17)
	$200_Radio = GUICtrlCreateRadio("200 dpi", 95, 80, 55, 17)
	$300_Radio = GUICtrlCreateRadio("300 dpi", 35, 110, 55, 17)
	$400_Radio = GUICtrlCreateRadio("400 dpi", 95, 110, 55, 17)
		 GUICtrlSetState(-1, $GUI_CHECKED)
	  Else
;~ 		 MsgBox(262208,"Сообщение...", "Значения качества не равно (150, 200, 300, 400). См файл ScanPFR.ini Секция Resolution = ...")
    $150_Radio = GUICtrlCreateRadio("150 dpi", 35, 80, 55, 17)
	$200_Radio = GUICtrlCreateRadio("200 dpi", 95, 80, 55, 17)
	$300_Radio = GUICtrlCreateRadio("300 dpi", 35, 110, 55, 17)
	$400_Radio = GUICtrlCreateRadio("400 dpi", 95, 110, 55, 17)
	  EndIf
   EndIf
EndIf
EndIf


	GUICtrlCreateGroup("Цвет картинки:", 190, 60, 160, 75)
	GUICtrlCreateButton ("Выбрать сканер", 190, 5, 160, 50)
	$SaveBtn = GUICtrlCreateButton ("Сохранить", 10, 142, 340, 30)


    GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_SHOW, $hSettings_GUI)

   While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                    ExitLoop
			Case $SaveBtn
				$Radio_CHECKED = Number(GUICtrlRead($PDF_Radio) = $GUI_CHECKED)
				If $Radio_CHECKED = 1 Then
				   IniWrite($iniFile, "Main", "FileFormat", 1)
;~ 				   MsgBox(262208,"Сообщение...", $Radio_CHECKED)
				   GUICtrlSetData ($FormatScan, "PDF")
				Else
				   IniWrite($iniFile, "Main", "FileFormat", 2)
				   GUICtrlSetData ($FormatScan, "JPEG")
			    EndIf
				   IniWrite($iniFile, "Main", "Resolution", 200)
					ExitLoop
;~                  $sRedactorPrg = GUICtrlRead($nRedactorPrg_Input)
;~ 				 $Color_Shema1 = Number(GUICtrlRead($Color_Shema_Radio1) = $GUI_CHECKED)
;~ 				 $Checkcfg = GUICtrlRead($sCheckcfg_Input)
;~ 				 $CriptPass = GUICtrlRead($sPassword_Input)
;~ 				 MsgBox(0,"11111111",$CriptPass)
;~ 				 $sPasswordKey = _StringEncrypt(1, $CriptPass, $sKeyPass, 1)
;~                  IniWrite($sConfig_File, "Main", "RedactorPrg", $sRedactorPrg)
;~ 				 IniWrite($sConfig_File, "Main", "Checkcfg", $Checkcfg)
;~ 				 IniWrite($sConfig_File, "Main", "Password", $sPasswordKey)
;~ 				 If $Color_Shema1 = 1 Then
;~ 					 IniWrite($sConfig_File, "Main", "Color_Shema", 1)
;~ 				 Else
;~ 					 IniWrite($sConfig_File, "Main", "Color_Shema", 2)
;~ 				 EndIf
;~             MsgBox(262208,"Сообщение...","Настройки сохранены" & @CRLF & "Перезапустите программу!!!")
;~             ExitLoop
        EndSwitch
    WEnd

    Opt("GUIOnEventMode", $iGOEM_Opt)
	GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hSettings_GUI)
 EndFunc




; Сканирование OnAcquire ( )
Func _TWAIN_Start($Save_As1, $Name_File1)
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc_MySQL")
Dim $sScanPDF = $Save_As1 & "\" & $Name_File1 & ".pdf"

$oTWAIN = ObjCreate("TwainControlXTrial.Twain")
If Not IsObj($oTWAIN) Then _DebugPrint("Not IsObj($oTWAIN)")

Global $oTWAINEvent = ObjEvent($oTWAIN, "_TWAIN_", "ITwainEvents")
Global $x, $p

;~ $iSelectDevice = $oTWAIN.SelectDevice
;~ _DebugPrint("$iSelectDevice = " & $iSelectDevice & " | " & $iSelectDevice)
;~ $oTWAIN.CurrentDevice = $iSelectDevice
$oTWAIN.CurrentDevice = $oTWAIN.DefaultDevice
$iCurrentDevice = $oTWAIN.CurrentDevice
$sDeviceName = $oTWAIN.DeviceName($iCurrentDevice)
;~ _DebugPrint("$iCurrentDevice = " & $iCurrentDevice & " | " & $sDeviceName)

$oTWAIN.PixelType = 2
$oTWAIN.Resolution = $Radio_Resolution

$oTWAIN.UseInterface = False
$oTWAIN.ShowProgress = True

$oTWAIN.MultiImage = True
; $oTWAIN.KeepImages = True

$x = 1
$p = 1

While $x = 1

;~ For $p = 1 To 1

;~     $oTWAIN.Resolution (150)
;~     $oTWAIN.PixelType (2)
;~ 	$oTWAIN.Threshold (128)
;~ 	$oTWAIN.Contrast (0)
;~ 	$oTWAIN.Brightness (0)
;~ 	$oTWAIN.Units (0)

    $oTWAIN.Acquire ()

;~     _DebugPrint("Units      = " & $oTWAIN.Units)
;~     _DebugPrint("Contrast   = " & $oTWAIN.Contrast)
;~     _DebugPrint("Threshold  = " & $oTWAIN.Threshold)
;~     _DebugPrint("PixelType  = " & $oTWAIN.PixelType)
;~     _DebugPrint("Resolution = " & $oTWAIN.Resolution)
;~     _DebugPrint("Brightness = " & $oTWAIN.Brightness)

    $oTWAIN.AddToPDF($p)
	_SMsg()
;~ Sleep(3000)
;~ Next
WEnd
;~ MsgBox(262208,"Сообщение...", $oTWAIN.PixelType)
$oTWAIN.WritePDF($sScanPDF)

$oTWAIN.Clear
$oTWAIN.Unload
$oTWAIN.UnloadDevice

;~ Func _TWAIN_OnAcquire()

;~ EndFunc

;~ Func _TWAIN_OnFinish()

;~ EndFunc

;~ Func _DebugPrint($_sDebugMsg, $_iScriptLine = @ScriptLineNumber)
;~     ConsoleWrite(StringFormat("%0" & StringLen(@ScriptLineNumber + 1) & "d | %s", $_iScriptLine, $_sDebugMsg) & @CR)
;~ EndFunc   ;==>_DebugPrint

EndFunc

; Многостарничный PDF
Func _SMsg()
		$answer = msgBox(36, "Вопрос:", " Добавить еще одну страницу в PDF?" )
		;32 Знак вопроса + 3 (Кнопка Yes, No и Cancel); 32 Знак вопроса + 1 Кнопка OK и Cancel
	Switch $answer
	    Case 1 ;OK
;~ 		   MsgBox(262208,"Сообщение...", "Нажата кнопка ОК")
;~ 		   $p = $p + 1
;~ 		   MsgBox(262208,"Сообщение...", $counter & " " & $p)
;~ 		   $sms = GUICtrlRead ($myedit)
;~ 		   StartNetSend($sPC, $sLV_Item_Text, $sms) ;
		Case 2 ;Cancel
;~ 			$x = $x + 1
		   ; _WinAPI_ShowMsg ("Выход...")
		Case 6 ;YES
;~ 		   MsgBox(262208,"Сообщение...", "Нажата кнопка ОК")
		   $p = $p + 1
		   ;_WinAPI_ShowMsg ("Да...")
		Case 7 ;NO
			$x = $x + 1
		   ;_WinAPI_ShowMsg ("Нет...")
	EndSwitch
EndFunc


Примечания: Для работы необходимо установить http://ciansoft.com/twaincontrolx/default.asp
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
artpluss

Посмотри эти темы:
http://autoit-script.ru/index.php?topic=9829.0
http://autoit-script.ru/index.php?topic=14824.0
http://autoit-script.ru/index.php/topic,14322.0.html
Возможно, какие-то примеры подойдут.
А так в Autoit не слишком хорошо с управлением сканированием.
 
Верх