Image mit Stretchblt vergroessern

Anfängerfragen zum Programmieren mit PureBasic.
UdBel
Beiträge: 3
Registriert: 15.10.2009 12:20

Image mit Stretchblt vergroessern

Beitrag von UdBel »

Hallo,
nach Jahren mit VB6 bin ich durch Zufall auf PB gestossen u. bin begeistert von der Geschwindigkeit und Kompaktheit des produzierten Codes.
Ich habe in VB6 ein Programm geschrieben zur automatischen Fokussierung eines Teleskops. Es steuert im Wesentlichen
einen Schrittmotor über USB und eine DSLR deren Bilder ich anzeige und auswerte.

Bei der Portierung des Programms auf PB bin ich auf einige Hindernisse gestossen:

Ich möchte ein Bild der Kamera (ca. 3400*2500 .jpg) laden und (verkleinert) darstellen.: Kein Problem!
Dann Bereiche des Bildes per Lupe in einem (anderen) Image-Gadget darstellen. Auch kein Problem , siehe Code:

Code: Alles auswählen

  ; Quellbild skaliert in den Gadget Massen (verkleinert) anzeigen
  LoadImage(0,filename$))
  ResizeImage(0, GadgetWidth(#quelle)-4, GadgetHeight(#quelle)-4)
  SetGadgetState(#quelle, ImageID(0))
  
  ;dann einen Ausschnitt des Quellbildes (Mausposition) in einem anderen
  ;ImageGadget vergroessert anzeigen
     
  hdcQuelle.l=GetDC_(GadgetID(#quelle))
  hdcZiel.l=GetDC_(GadgetID(#ziel))
  StretchBlt_(hdcZiel,0,0,GadgetWidth(#ziel),GadgetHeight(#ziel),hdcQuelle ,mousex,mousey,50,50,#SRCCOPY)
Das Problem ist, dass die stretchblt_ Funktion das komprimierte (verkleinerte) Bild vergrössert und nicht das Ursprungsbild.
In VB6 war das einfach. Hier habe ich ein Dummy-Picture Objekt in Ursprungsgrösse des Bildes (unsichtbar, visible=False) als Quelle verwendet.
Das geht offensichtlich in PB nicht !? Hier muss das ImageGadget sichtbar im Fenster sein!?

Wie kann ich das lösen:
Ich dachte an:
CopyImage(0,1) ; Das Bild in den Speicher kopieren?
...?

Wie komme ich dann an "hdcQuelle" für die API-Funktion stretchblt_ des Bildes in Originalgrösse?
Kann man (Image)-Gadgets auf Visible=False setzen? Wenn ja, wie?
Oder gibt es einen eleganteren Weg?

Fragen über Fragen!

Für eine hilfreiche Unterstützung wäre ich sehr dankbar!


VG
Udo
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Image mit Stretchblt vergroessern

Beitrag von bobobo »

Kack ein auf Api :D

Nimmste die Purebasic eigene ResizeImage-Funktion (Siehe PB-Hilfe)
Dann klappts auch mit dem Copyimage davor.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
UdBel
Beiträge: 3
Registriert: 15.10.2009 12:20

Re: Image mit Stretchblt vergroessern

Beitrag von UdBel »

Hi bobobo,

.. vielen Dank, aber das hilft mir jetzt nicht wirklich!

ResizeImage kennn ich ja schon (siehe Code).

Nochmal zu Verdeutlichung:

1. Grosses Bild (~3400*2500) in Image-Gadget (~400*300) verkleinert darstellen.
2. Bereich (~50*50 = Mausposition) vergrössert in einem zweiten Image-Gadget (~200*200) darstellen (Lupe).
3. Referenz soll aber nicht das verkleinerte Bild sein, sondern das hochaufgelöste Urspungsbild (Datei)!

VG
Udo
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Image mit Stretchblt vergroessern

Beitrag von bobobo »

und ?
das Problem ist doch nur dass du kein hdc für das große Bild mehr hast.
Kannst Du ein ImageGadget erstellen welches man nicht sieht?

Oder du nimmst in echt mal das GrabImage von PB. Das liefert Dir den passenden Ausschnitt doch auch.

folgendes geht (pb 4.4 beta 5)

Code: Alles auswählen

Enumeration
#Image_gross
#Image_klein
#Image_kleinback

#Image_rect
EndEnumeration
UseJPEGImageDecoder()
pic.s="D:\Eigene Dateien\Eigene Bilder\!DerSchreck.jpg"
;pic.s="D:\Eigene Dateien\Eigene Bilder\0,1020,126208,00.jpg"
If LoadImage(#Image_gross,pic)
  CopyImage(#Image_gross,#Image_klein)
  ResizeImage(#Image_klein,200,200)
  CopyImage(#Image_klein,#Image_kleinback)
  
EndIf
ow.f=ImageWidth(#Image_gross)
oh.f=ImageHeight(#Image_gross)
x=10
y=10
GrabImage(#Image_gross,#Image_rect,x,y,y+50,y+50)

OpenWindow(0,0,0,800,800,"nanu",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(0,0,0,200,200,ImageID(#Image_klein))
ImageGadget(1,0,220,720,720,ImageID(#Image_rect))

Repeat
  event=WaitWindowEvent()
  If event=#PB_Event_CloseWindow
    quit=1
  EndIf
  
  If WindowMouseX(0)>0 And WindowMouseY(0)>0 And WindowMouseX(0)<=200 And WindowMouseY(0)<=200
    SetWindowTitle(0,"drin")
    If sh=0
      ShowCursor_(#False)
      sh=1
    EndIf

    GrabImage(#Image_gross,#Image_rect,WindowMouseX(0)*(ow/200),WindowMouseY(0)*(oh/200),50,50)
    SetGadgetState(1,ImageID(#Image_rect))
    CopyImage(#Image_kleinback,#Image_klein)
    StartDrawing(ImageOutput(#Image_klein))
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(WindowMouseX(0),WindowMouseY(0),50*200/ow,50*200/oh)
    StopDrawing()
    SetGadgetState(0,ImageID(#Image_klein))
  Else
    SetWindowTitle(0,"draussen")
    If sh=1
      ShowCursor_(#True)
      sh=0
    EndIf
    
  EndIf
  
Until Quit=1
End
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
UdBel
Beiträge: 3
Registriert: 15.10.2009 12:20

Re: Image mit Stretchblt vergroessern

Beitrag von UdBel »

Hi,

perfekt!

Vielen Dank!
VG
Udo
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Image mit Stretchblt vergroessern

Beitrag von bobobo »

nicht ganz perfekt

ich hab da noch ein float reingebastelt damit das AnzeigeQuadrat auch korrekt erscheint.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten