Mit EZTWAIN wäre sowas möglich. Ich hoffe dies hier ist brauchbar
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