simples Scanprogramm

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

simples Scanprogramm

Beitrag von hjbremer »

für meine Ebayauktionen scanne ich immer einige Sachen ab und nun hatte ich keine Lust mehr immer das große alles erschlagende Paint Shop zu benutzen.

hier eine kleines simples Tool zum Scannen und zum zurecht schneiden des Bildes ( mit den Pfeiltasten)

ist sicher nicht perfekt, auch der Prog-Stil ist nicht berauschend, halt kurz hingehackt. Ein kleiner Teil des Codes stammt aus der mitgelieferten Demo.

vielleicht kanns ja einer gebrauchen

Code: Alles auswählen

;TwScann.dll from Andreas Miethe 
;http://www.ampsoft.eu/purebasic/dlls.php 

EnableExplicit

UseJPEGImageEncoder() 

Enumeration
#mainwindow
#container1
#bscanstart
#bscansave
#imagenr
#bimagenr
#pastecut
#textinfo
#texthelp
#fontnr
#imgcpy
#imgori
EndEnumeration

;Shared Variablen definieren
Define clip, imgbr, imghh, bhf.f
Define scandllnr, altclipboard$

Procedure.i BildBrightness(wert)
  
   Protected hh = ImageHeight(#imagenr) 
   Protected br = ImageWidth(#imagenr)  
   Protected tmp = CreateImage(#PB_Any, br, hh)
   Protected ca.COLORADJUSTMENT
  
   Protected dc = StartDrawing(ImageOutput(tmp)) 
      DrawImage(ImageID(#imagenr), 0, 0)
      SetStretchBltMode_(dc, #HALFTONE)
      GetColorAdjustment_(dc, ca)
      ca\caBrightness = wert 
      SetColorAdjustment_(dc, ca)
      StretchBlt_(dc,0,0,br,hh, dc,0,0,br,hh, #SRCCOPY)
   StopDrawing() 
   GrabImage(tmp, #imagenr, 0, 0, br, hh) 
   FreeImage(tmp) 
  
EndProcedure

Procedure.i Bilddrehen(rl = 'rechts') 

   Protected hh = ImageHeight(#imagenr) 
   Protected br = ImageWidth(#imagenr) 
   Protected tmp
   
   If hh > br 
      tmp = CreateImage(#PB_Any, hh, hh) 
   Else 
      tmp = CreateImage(#PB_Any, br, br) 
   EndIf 
   
   Dim p.point(2) 
   
   If rl = 'rechts'
      p(0)\x=hh 
      p(0)\y=0 
      p(1)\x=hh 
      p(1)\y=br 
      p(2)\x=0 
      p(2)\y=0 
   Else
      p(0)\x=0
      p(0)\y=br 
      p(1)\x=0
      p(1)\y=0
      p(2)\x=hh  
      p(2)\y=br  
   EndIf
   
   Protected dc = StartDrawing(ImageOutput(tmp)) 
      DrawImage(ImageID(#imagenr), 0, 0) 
      PlgBlt_(dc, p(), dc, 0, 0, br, hh, 0, 0, 0) 
   StopDrawing() 
   GrabImage(tmp, #imagenr, 0, 0, hh, br) 
   FreeImage(tmp) 
   
EndProcedure 

Procedure.i resizeFenster(br = 0, hh = 0)
   
   Shared imgbr, imghh
    
   If br = 0: br = imgbr + 130: EndIf
   If hh = 0: hh = imghh + 20: EndIf
   If hh < 180: hh = 180: EndIf
      
   ResizeWindow(#mainwindow, #PB_Ignore, #PB_Ignore, br, hh)
   ResizeGadget(#container1, #PB_Ignore, #PB_Ignore, br, hh)
   ResizeGadget(#texthelp,   #PB_Ignore, #PB_Ignore, br, hh)

EndProcedure

Procedure.i TextInfo()
   
   Shared imgbr, imghh
  
   SaveImage(#imagenr, "dummy", #PB_ImagePlugin_JPEG) 
  
   Protected txt$
   txt$ = Str(imgbr) + " x " + Str(imghh) + #LF$ 
   txt$ + Str(FileSize("dummy"))
   SetGadgetText(#textinfo, txt$)

EndProcedure

Procedure.i ScannerDllOpen()  
   
   Protected nr = OpenLibrary(#PB_Any, "TwScann.dll") 
   If nr 
      Protected isTwain = CallFunction(nr, "IsTwain") 
      If isTwain = 0 
         MessageRequester("Info", "Scanner mit TWAIN interface! nicht gefunden") 
         End
      Else
         CallFunction(nr, "SelectSource") 
      EndIf 
   Else 
      MessageRequester("Info", "TwScann.dll nicht gefunden!") 
      End
   EndIf 
   
ProcedureReturn nr 
EndProcedure

Procedure.i ScannerStart(flag=0)
   
   Shared clip, imgbr, imghh, bhf.f
   Shared scandllnr, altclipboard$

   altclipboard$ = GetClipboardText() 

   If Not scandllnr: ProcedureReturn: EndIf
           
   CallFunction(scandllnr, "ScanToClip", 0) ; 0=mit Scannerbild
  
   If IsImage(clip): FreeImage(clip): EndIf
  
   clip = GetClipboardImage(#PB_Any) 
   If clip 

      imgbr = ImageWidth(Clip) 
      imghh = ImageHeight(Clip) 
      bhf = imghh / imgbr        ;:Debug bhf     
               
      imgbr / 4  ;:Debug imgbr
      imghh / 4  ;:Debug imghh
     
      CreateImage(#imagenr, imgbr, imghh) 
      StartDrawing(ImageOutput(#imagenr)) 
         DrawImage(ImageID(clip), 0, 0, imgbr, imghh) 
      StopDrawing() 
     
      resizeFenster()
      textInfo()
      SetGadgetState(#bimagenr, ImageID(#imagenr)) 

  Else 
      MessageRequester("Info", "kein Bild in Clipboard!") 
  EndIf 

EndProcedure

Procedure.i imgsave()
   
   Shared clip
   Shared altclipboard$

   Protected vorgabe$ = Left(altclipboard$, 40)
   Protected filename$
   
   If clip 
      filename$ = SaveFileRequester("Bild speichern", vorgabe$, "JPEG (*.jpg)|*.jpg", 0) 
      If filename$ 
         If FindString(filename$, ".jpg", 1) = 0 : filename$ + ".jpg" : EndIf 
         SaveImage(#imagenr, filename$, #PB_ImagePlugin_JPEG) 
      EndIf 
   Else 
      MessageRequester("Info", "kein Bild !") 
   EndIf 
  
EndProcedure

Procedure.i merge()
   
   Shared clip, imgbr, imghh, bhf.f
   
   If Not IsImage(#imagenr): ProcedureReturn: EndIf
   If Not IsImage(#imgcpy): ProcedureReturn: EndIf
   
   CopyImage(#imagenr, #imgori)
   
   imgbr = ImageWidth(#imgori) + ImageWidth(#imgcpy)
   imghh = ImageHeight(#imgori)
   bhf = imghh / imgbr
   
   CreateImage(#imagenr, imgbr, imghh) 
   StartDrawing(ImageOutput(#imagenr))           
     DrawImage(ImageID(#imgori), 0, 0) 
     DrawImage(ImageID(#imgcpy), ImageWidth(#imgori), 0)            
   StopDrawing() 
   
   resizeFenster()
   textInfo()   
   SetGadgetState(#bimagenr, ImageID(#imagenr)) 
   
EndProcedure

Procedure.i paste()
   
   Shared clip, imgbr, imghh, bhf.f

   clip = GetClipboardImage(#PB_Any) 
   If clip 
  
      imgbr = ImageWidth(Clip)   ;:Debug imgbr
      imghh = ImageHeight(Clip)  ;:Debug imghh                        
      bhf = imghh / imgbr        ;:Debug bhf
    
      CreateImage(#imagenr, imgbr, imghh) 
      StartDrawing(ImageOutput(#imagenr)) 
         DrawImage(ImageID(Clip), 0, 0, imgbr, imghh) 
      StopDrawing() 
     
      resizeFenster()
      textInfo()
      SetGadgetState(#bimagenr, ImageID(#imagenr)) 

  Else 
      MessageRequester("Info", "kein Bild in Clipboard!") 
  EndIf 

EndProcedure

Procedure.i cut_etc(taste)
   
   Shared imgbr, imghh, bhf.f
   
   Protected weg, x, y, br, hh, ziel
   
   If IsImage(#imagenr) 
  
      imgbr = ImageWidth(#imagenr) 
      imghh = ImageHeight(#imagenr)
      weg = 5     
     
      Select taste
           Case 38  ;Pfeil oben - Bild nach oben schieben
                   x  = 0
                   y  = weg
                   br = imgbr
                   hh = imghh - weg
                
           Case 40  ;Pfeil unten - Bild nach unten schieben
                   x = 0
                   y = 0
                   br = imgbr
                   hh = imghh - weg
                
           Case 37  ;Pfeil links - Bild nach links schieben
                   x  = 5
                   y  = 0
                   br = imgbr - weg
                   hh = imghh 
                
           Case 39  ;Pfeil rechts - Bild nach rechts schieben
                   x  = 0
                   y  = 0
                   br = imgbr - weg
                   hh = imghh
                
           Case 33  ;Bild oben
                   If bhf = 1: bhf = 1.1: EndIf
                   If bhf < 1: bhf + 1: EndIf
                   imgbr * bhf
                   imghh * bhf
                   ResizeImage(#imagenr, imgbr, imghh)                   
                   x  = 0
                   y  = 0
                   br = imgbr
                   hh = imghh 
           
           Case 34  ;Bild unten
                   If bhf = 1: bhf = 1.1: EndIf
                   If bhf < 1: bhf + 1: EndIf
                   imgbr / bhf
                   imghh / bhf
                   ResizeImage(#imagenr, imgbr, imghh)                                      
                   x  = 0
                   y  = 0
                   br = imgbr
                   hh = imghh 

           Case 13
                   BildDrehen()
                   x  = 0
                   y  = 0
                   br = ImageWidth(#imagenr) 
                   hh = ImageHeight(#imagenr)                   
           
           Case 107
                   BildBrightness(10)
                   x  = 0
                   y  = 0
                   br = ImageWidth(#imagenr) 
                   hh = ImageHeight(#imagenr)
                   
           Case 109
                   BildBrightness(-10)
                   x  = 0
                   y  = 0
                   br = ImageWidth(#imagenr) 
                   hh = ImageHeight(#imagenr)
                   
           Default: ProcedureReturn
             
      EndSelect           
     
      ;                quelle    ziel
      ziel = GrabImage(#imagenr, #PB_Any, x, y, br,hh)

      imgbr = br  ;hier ImageWidth benutzen führt zu Fehlern
      imghh = hh  ; "" 
      x = 0
      y = 0
      GrabImage(ziel, #imagenr, x, y, imgbr, imghh)
     
      SetGadgetState(#bimagenr, ImageID(#imagenr))
      FreeImage(ziel) 
      textInfo()
      resizeFenster()
   
      bhf = imghh / imgbr        
                                          
   EndIf 

EndProcedure

; ---------------------------------------------

LoadFont(#fontnr, "Courier New", 10)

SetClipboardText("bild")

scandllnr = ScannerDllOpen()

OpenWindow(#mainwindow, 100, 100, 120, 150, "Scan 1.04", #PB_Window_SystemMenu) 

AddKeyboardShortcut(#mainwindow, #PB_Shortcut_Control | #PB_Shortcut_S, 1001)
AddKeyboardShortcut(#mainwindow, #PB_Shortcut_Control | #PB_Shortcut_M, 1002)

  ContainerGadget(#container1,  0,   0, 120, 150)
     ButtonGadget(#bscanstart, 10,  10, 100,  30, "Scan") 
     ButtonGadget(#bscansave,  10,  50, 100,  30, "Save") 
     ButtonGadget(#pastecut,   10,  90, 100,  30, "paste") 
       TextGadget(#textinfo,   10, 130, 100,  36, "F1 = Info", #PB_Text_Center) 
      ImageGadget(#bimagenr,  120,  10,   0,   0, 0, #PB_Image_Border) 
  CloseGadgetList()
  
  TextGadget(#texthelp, 0, 0, 120, 140, "") 
  HideGadget(#texthelp,1)
  SetGadgetFont(#texthelp, FontID(#fontnr)) 
  
  Define helptext$
  helptext$ = " Button Start: Scannen" + #LF$
  helptext$ + " Button Save:  Bild speichern" + #LF$
  helptext$ + " Button Paste: kopiertes Bild laden" + #LF$ + #LF$
  helptext$ + " Pfeiltasten:  Rand abschneiden" + #LF$
  helptext$ + " Bild unten:   Bild verkleinern" + #LF$ 
  helptext$ + " Bild oben:    Bild vergrößern" + #LF$
  helptext$ + " Enter:        Bild drehen" + #LF$
  helptext$ + " + -           Bild heller/dunkler" + #LF$
  helptext$ + " Strg S:       Bild intern speichern" + #LF$
  helptext$ + " Strg M:       mit Bild intern mergen" + #LF$

  helptext$ + #LF$ + " ESC: zurück"
  SetGadgetText(#texthelp, helptext$)
  
Define event, taste, altbr, althh
  
Repeat: event = WaitWindowEvent() 
      If event = #PB_Event_Gadget 
        
         Select EventGadget() 
            Case #bscanstart: ScannerStart()
            Case #bscansave: imgsave()
            Case #pastecut:  paste()
         EndSelect 
           
      ElseIf event = #PB_Event_Menu
         Select EventMenu()
            Case 1001: CopyImage(#imagenr, #imgcpy)
            Case 1002: merge()   
         EndSelect
         
      ElseIf event = #WM_KEYDOWN 
           taste = EventwParam()  ;:Debug taste
           Select taste
             Case 16, 17   ;Strg, Shift
             Case 27  ;ESC 
                  resizeFenster(altbr, althh)
                  HideGadget(#texthelp, 1)
                  HideGadget(#container1, 0)
             Case 112 ;F1
                  altbr = WindowWidth(#mainwindow)
                  althh = WindowHeight(#mainwindow)
                  resizeFenster(400, 250) 
                  HideGadget(#texthelp, 0)
                  HideGadget(#container1, 1)
             Default
                cut_etc(taste)
           EndSelect        
      EndIf 

Until Event = #PB_Event_CloseWindow 
  
If scandllnr: CloseLibrary(scandllnr): EndIf 

End
__________________________________________________
Thread wurde verschoben
Anfänger>Code, Tipps und Tricks
22.08.2009
RSBasic
Zuletzt geändert von hjbremer am 27.07.2010 19:30, insgesamt 1-mal geändert.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Eher was für Code, Tipps und Tricks, oder?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@hjbremer
Wenn du einen Beispielcode posten möchtest, dann bitte im "Code, Tipps und Tricks"-Unterforum posten.
Im "Anfänger"-Unterforum kommen nur Fragen rein.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: simples Scanprogramm

Beitrag von hjbremer »

kleines Update mit Minihilfe, Bilddrehen, größer/kleiner, Helligkeit

noch ein kleines Update, Code siehe oben
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: simples Scanprogramm

Beitrag von hjbremer »

wieder ein kleines Update , Code siehe oben

neu sind die Tasten Strg S um ein Bild intern zu speichern und mit Strg M wird das alte Bild mit dem aktuellen Bild zusammen angezeigt.

PS: mit PB 4.31 ist das Programm ca 45 Kb kleiner als wenn man 4.5 nimmt
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
ralle
Beiträge: 88
Registriert: 29.11.2004 17:50
Wohnort: Berlin

Verkleinerung des gescannten Bildes

Beitrag von ralle »

Hallo hjbremer!

Erst mal vielen Dank für deinen Einstieg in PB zum Thema scannen. Viel gibt es dazu ja nicht gerade und diesbezüglich habe ich mal dein Programm und die Funktionen getestet. Dabei ist mir im Vergleich zu MSPaint eines aufgefallen: Bei identischen Einstellungen eines Scans wird dein Bild ca. um den Faktor 4 kleiner. Habe die entsprechende Codezeile mit dem scaling auch gefunden denke ich:

Code: Alles auswählen

152      imgbr / 4  ;:Debug imgbr
153      imghh / 4  ;:Debug imghh
Nun meine Frage dazu: Hat das einen speziellen Grund, warum du explizit verkleinerst, oder waren dir die anderen Bilder ansonsten zu groß? Muss diese Konvertierung sein, oder war das eine reine individuelle Anpassung zur Übersicht halber? Kann ja sein, dass das in einem besonderen Kontext in PB nötig ist.

MfG
Ralle :)
Benutzeravatar
kwai chang caine
Beiträge: 57
Registriert: 29.11.2007 14:30

Re: simples Scanprogramm

Beitrag von kwai chang caine »

Danke :allright:
Trotz all meiner Bemühungen.
Ich werde nie sprechen Deutsch

Dann ist das "google", das ist für mich
Danke
Antworten