Seite 1 von 1

Bild vom Scanner einlesen / weiterverarbeiten

Verfasst: 11.06.2009 15:24
von hiltwin
Hallo miteinander,

gibt es einen einfachen Weg, am besten mit ganz wenig Zeilen Code, um ein vom Scanner geliefertes Bild in den Speicher zu bekommen, um dann mit PB das Bild in einem bestimmten Ordner abzuspeichern?

Bild kann/soll in Originalgröße verbleiben, evtl. höchstens modifiziert als s/w.

Hat da schon mal jemand was mit gemacht, gibt es da irgendwelche Codezeilen für?

Frdl. Gruss

Hiltwin

Verfasst: 11.06.2009 20:22
von Captn. Jinguji
Hmm... dürfte nicht mit ein paar Zeilen zu machen sein, selbst das CodeArchive schweigt sich aus.
Ansätze finden sich halt hier: http://www.jse.de/download.html
da die allermeisten Scanner TWAIN basiert sind, aber:
TWAIN SDK
The sales of the TWAIN Integration Kit 2.0 has been discontinued. If you are interested in a 32 bit or 16 bit Wincows DLL based TWAIN SDK please contact the JSE support.

Verfasst: 13.06.2009 14:11
von Falko
Mit EZTWAIN wäre sowas möglich. Ich hoffe dies hier ist brauchbar :wink:
Ich habe den Originalsource von Num3, aus dem englischen Forum,
zum EZTWAIN modifiziert. Die ganzen gotos rausgeschmissen und
eine Bildanpassung dazu erstellt.

Hier kann man sich die folgende Zip runterladen: http://www.dosadi.com/ezt1_download.htm

Im Ordner ..\EZTWAIN1\VC\RELEASE
sind EZTW32.dll und EZTW32.lib enthalten, die ins Verzeichnis zu diesem
Code kopiert werden sollten.

Code: Alles auswählen

;Grundgerüst von Num3
;http://www.purebasic.fr/english/viewtopic.php?t=10376&highlight=twain

;Angepasst auf PB 4.31 in verbindung mit EZTWAIN.DLL und Libraty von Falko
;Downlaod Twain.DLL plus lib hier: http://www.dosadi.com/eztwain1.htm

ExamineDesktops()
UsePNGImageEncoder()

Import"EZTW32.lib"
  ;Diese Funktionen sind soweit getestet und angepasst
  TWAIN_IsAvailable() As "_TWAIN_IsAvailable@0"
  TWAIN_SelectImageSource(hWnd.l) As "_TWAIN_SelectImageSource@4" 
  TWAIN_AcquireToFilename(hWnd.l, picpath.s) As "_TWAIN_AcquireToFilename@8"
  TWAIN_AcquireToClipboard(hWnd.l,wPixTypes.l) As "_TWAIN_AcquireToClipboard@8"
  TWAIN_CloseSource()As "_TWAIN_CloseSource@0"
  TWAIN_CloseSourceManager(hWnd) As "_TWAIN_CloseSourceManager@4"
  TWAIN_EasyVersion() As "_TWAIN_EasyVersion@0"
  TWAIN_State() As "_TWAIN_State@0"
  TWAIN_DibDepth(hWnd.l) As "_TWAIN_DibDepth@4"
  TWAIN_DibHeight(hWnd.l) As "_TWAIN_DibHeight@4"
  TWAIN_DibNumColors(hWnd.l) As "_TWAIN_DibNumColors@4"
  TWAIN_DibWidth(hWnd.l) As "_TWAIN_DibWidth@4"
  TWAIN_AcquireNative(hWnd.l,wPixTypes.l) As "_TWAIN_AcquireNative@8"
  TWAIN_LoadNativeFromFilename(File.s) As "_TWAIN_LoadNativeFromFilename@4"
  TWAIN_LoadNativeFromFile(pszFile.l) As "_TWAIN_LoadNativeFromFile@4"
 
  ;Folgende Funktionen sind noch nicht angepasst!!
  DIB_ReadRow(a.l,b.l,c.l) As "_DIB_ReadRow@12"
  DIB_RowBytes(a.l) As "_DIB_RowBytes@4"
  DllMain(a.l,b.l,c.l) As "_DllMain@12"
  TWAIN_AbortAllPendingXfers() As "_TWAIN_AbortAllPendingXfers@0"
  TWAIN_BreakModalLoop() As "_TWAIN_BreakModalLoop@0"
  TWAIN_CreateDibPalette(a.l) As "_TWAIN_CreateDibPalette@4"
  TWAIN_DS(a.l,b.l,c.l,d.l) As "_TWAIN_DS@16"
  TWAIN_DisableSource() As "_TWAIN_DisableSource@0"
  TWAIN_DrawDibToDC(a.l,b.l,c.l,d.l,e.l,f.l,g.l,h.l) As "_TWAIN_DrawDibToDC@32"
  TWAIN_EnableSource(a.l) As "_TWAIN_EnableSource@4"
  TWAIN_EndXfer() As "_TWAIN_EndXfer@0"
  TWAIN_ErrorBox(a.l) As "_TWAIN_ErrorBox@4"
  TWAIN_Fix32ToFloat(a.l) As "_TWAIN_Fix32ToFloat@4"
  TWAIN_FreeNative(a.l) As "_TWAIN_FreeNative@4"
  TWAIN_GetBitDepth() As "_TWAIN_GetBitDepth@0"
  TWAIN_GetCapCurrent(a.l,b.l,c.l) As "_TWAIN_GetCapCurrent@12"
  TWAIN_GetConditionCode() As "_TWAIN_GetConditionCode@0"
  TWAIN_GetCurrentResolution() As "_TWAIN_GetCurrentResolution@0"
  TWAIN_GetCurrentUnits() As "_TWAIN_GetCurrentUnits@0"
  TWAIN_GetHideUI() As "_TWAIN_GetHideUI@0"
  TWAIN_GetPixelType() As "_TWAIN_GetPixelType@0"
  TWAIN_GetResultCode() As "_TWAIN_GetResultCode@0"
  TWAIN_GetYResolution() As "_TWAIN_GetYResolution@0"
  TWAIN_LoadSourceManager() As "_TWAIN_LoadSourceManager@0"
  TWAIN_MessageHook(a.l) As "_TWAIN_MessageHook@4"
  TWAIN_Mgr(a.l,b.l,c.l,d.l) As "_TWAIN_Mgr@16"
  TWAIN_ModalEventLoop() As "_TWAIN_ModalEventLoop@0"
  TWAIN_NegotiatePixelTypes(a.l) As "_TWAIN_NegotiatePixelTypes@4"
  TWAIN_NegotiateXferCount(a.l) As "_TWAIN_NegotiateXferCount@4"
  TWAIN_OpenDefaultSource() As "_TWAIN_OpenDefaultSource@0"
  TWAIN_OpenSourceManager(a.l) As "_TWAIN_OpenSourceManager@4"
  TWAIN_RegisterApp(a.l,b.l,c.l,d.l,e.l,f.l,g.l,h.l) As "_TWAIN_RegisterApp@32"
  TWAIN_ReportLastError(a.l) As "_TWAIN_ReportLastError@4"
  TWAIN_SetBitDepth(a.l) As "_TWAIN_SetBitDepth@4"
  TWAIN_SetBrightness(a.l,b.l) As "_TWAIN_SetBrightness@8"
  TWAIN_SetCapOneValue(a.l,b.l,c.l) As "_TWAIN_SetCapOneValue@12"
  TWAIN_SetContrast(a.l,b.l) As "_TWAIN_SetContrast@8"
  TWAIN_SetCurrentPixelType(a.l) As "_TWAIN_SetCurrentPixelType@4"
  TWAIN_SetCurrentResolution(a.l,b.l) As "_TWAIN_SetCurrentResolution@8"
  TWAIN_SetCurrentUnits(a.l) As "_TWAIN_SetCurrentUnits@4"
  TWAIN_SetHideUI(a.l) As "_TWAIN_SetHideUI@4"
  TWAIN_SetXferMech(a.l) As "_TWAIN_SetXferMech@4"
  TWAIN_ToFix32(a.l,b.l) As "_TWAIN_ToFix32@8"
  TWAIN_UnloadSourceManager() As "_TWAIN_UnloadSourceManager@0"
  TWAIN_WaitForNativeXfer(a.l) As "_TWAIN_WaitForNativeXfer@4"
  TWAIN_WriteNativeToFile(a.l,b.l) As "_TWAIN_WriteNativeToFile@8"
  TWAIN_WriteNativeToFilename(a.l,b.l) As "_TWAIN_WriteNativeToFilename@8"
  TWAIN_XferMech() As "_TWAIN_XferMech@0"
EndImport

Global window_0=0
Enumeration
#cmdSelect 
#cmdScan
#cmdScanClip
;#cmdView
#img
EndEnumeration

;-- TWAIN_AcquireNative(HWND hwndApp, unsigned wPixTypes)
#TWAIN_BW = 1     ; 1-bit per pixel, B&W (== TWPT_BW)
#TWAIN_GRAY = 2   ; 1,4, Or 8-bit grayscale (== TWPT_GRAY)
#TWAIN_RGB = 4    ; 24-bit RGB color (== TWPT_RGB)
#TWAIN_PALETTE =8 ; 1,4, Or 8-bit palette (== TWPT_PALETTE) hImage.l
#TWAIN_ANYTYPE =0 ;any of the above

;-- TWAIN_FreeNative(HANDLE hdib);
;             1 bit B&W       8-bit grayscale     24-bit color
; 100 dpi      1.25KB              10KB               30KB
; 200 dpi        5KB               40KB              120KB
; 300 dpi      11.25KB             90KB              270KB
; 400 dpi       20KB              160KB              480KB

;-- TWAIN_State(void) -- Returns the TWAIN Protocol State per spec.
#TWAIN_PRESESSION=1	; source manager Not loaded
#TWAIN_SM_LOADED=2	  ;source manager loaded
#TWAIN_SM_OPEN=3	    ;source manager open
#TWAIN_SOURCE_OPEN=4	;source open but Not enabled
#TWAIN_SOURCE_ENABLED=5	;source enabled To acquire
#TWAIN_TRANSFER_READY=6	;image ready To transfer
#TWAIN_TRANSFERRING=7	  ;image in transit




Declare.l DrawPic(hImage)
Define.f imgW,imgH,TW,TH
Define.l Teiler,hImage,hWnd

picpath.s = GetPathPart(ProgramFilename())+"pic.bmp"

Procedure.l DrawPic(hImage) ; Hiermit wird das Bild im Verhältnis angepasst im Window ausgegeben.
   If hImage
      imgW.f=ImageWidth(#img)
      imgH.f=ImageHeight(#img)
      TW.f=imgW/767
      TH.f=imgH/420
      If TW>TH
      Teiler=Round(TW,#PB_Round_Up)
      Else
      Teiler=Round(TH,#PB_Round_Up)
      EndIf
      If Teiler=0
         Teiler=1
      EndIf         
      StartDrawing(WindowOutput(0))
      DrawImage(hImage,  10,50,imgW/Teiler, imgH/Teiler)
      StopDrawing()
       result = 1  
    Else 
       result = 0
    EndIf 
    ProcedureReturn result
EndProcedure

hWnd = OpenWindow(window_0, (DesktopWidth(0)-767)/2, (DesktopHeight(0)-476)/2, 767, 476, "SCAN Ver: "+Str(TWAIN_EasyVersion()), #PB_Window_SystemMenu)
If hWnd  = 0
  End
EndIf
ButtonGadget(#cmdSelect,  10, 10, 190, 30, "Auswahl TWAIN - Treiber")
ButtonGadget(#cmdScan,  210, 10, 190, 30, "SCAN zu BMP")
ButtonGadget(#cmdScanClip,  410, 10, 190, 30, "SCAN zu Clipboard")

;Debug TWAIN_State() 
;-- Test Twain_AcquereNative 
MessageRequester("Twain_AcquereNative", "Mit Twain_AcquereNative wird der Twainmanager sofort gestartet"+#CRLF$+"und die Bildeigenschaften ausgegeben")
hdib.l=TWAIN_AcquireNative(hWnd.l,0)
If hdib
  Debug "Bittiefe bits/Pixel= "+Str(TWAIN_DibDepth(hdib))
  Debug "Anzahl der Farben der Farbtabelle von DIB= "+Str(TWAIN_DibNumColors(hdib))
  Debug "Bildhöhe in Pixel= "+Str(TWAIN_DibHeight(hdib))
  Debug "Bildbreite in Pixel = "+Str(TWAIN_DibWidth(hdib))
EndIf
MessageRequester("TWAIN_LoadNativeFromFilename(File)", "Mit TWAIN_LoadNativeFromFilename(File) laeds Du irgendeine Bitmap-File."+#CRLF$+"Danach erneut eine Ausgabe der Bildeigenschaften")
;-- Test Twain_LoadNativeFromFilename
File.s=OpenFileRequester("Bild laden","Twain.bmp","Bitmaps(bmp)|*.BMP",0)
If File
  hdib = TWAIN_LoadNativeFromFilename(File)
  Debug "Bittiefe bits/Pixel= "+Str(TWAIN_DibDepth(hdib))
  Debug "Anzahl der Farben der Farbtabelle von DIB= "+Str(TWAIN_DibNumColors(hdib))
  Debug "Bildhöhe in Pixel= "+Str(TWAIN_DibHeight(hdib))
  Debug "Bildbreite in Pixel = "+Str(TWAIN_DibWidth(hdib))
EndIf

MessageRequester("Hauptprogramm", "Jetzt dürft ihr selbst was auswählen und scannen :)")

Repeat
  EventID  = WaitWindowEvent()
  Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #cmdSelect
           TWAIN_SelectImageSource(hWnd)
           Debug TWAIN_State()
        Case #cmdScan
           TWAIN_AcquireToFilename(hWnd, picpath)
           hImage=LoadImage(#img, picpath)
           SaveImage(#img,GetPathPart(ProgramFilename())+"pic.png",#PB_ImagePlugin_PNG )
           DrawPic(hImage)
        Case #cmdScanClip
           TWAIN_AcquireToClipboard(hWnd,0)  ;0 = Vom Twain eingestellte Vorgabe. Andere Einstellungen, siehe ;PixTypes Constants
           TWAIN_CloseSource()
           hImage= GetClipboardImage(#img)
           DrawPic(hImage)
      EndSelect
  EndSelect
Until EventID  = #PB_Event_CloseWindow
End
[Edit]

Nochmal erweitert auf ClipboardImage. Es gibt noch viele tolle
Funktionen mehr, die man sich aus den Beispielen entnehmen kann.
Um auf Farbe, Grau oder Schwarz/Weiß um zu stellen, kann man
den Wert von PixelType ändern. Die Version wird oben im Titel angezeigt.

Ich habe die gebräuchlichsten Funktionen angepasst sowie alle
möglichen Funktionen mit eingebaut, die aber evtl. noch
angepasst werden müssen. Am besten mal im Ordner VC gucken,
dort sind die Parameter gut erklärt.
[/Edit]


[Edit]
Weitere Beispiele im PB-Source hinzugefügt. 18.06.2009

[/Edit]

Gruß Falko