Seite 1 von 1

Image mit Stretchblt vergroessern

Verfasst: 15.10.2009 13:14
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

Re: Image mit Stretchblt vergroessern

Verfasst: 15.10.2009 13:36
von bobobo
Kack ein auf Api :D

Nimmste die Purebasic eigene ResizeImage-Funktion (Siehe PB-Hilfe)
Dann klappts auch mit dem Copyimage davor.

Re: Image mit Stretchblt vergroessern

Verfasst: 15.10.2009 13:54
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

Re: Image mit Stretchblt vergroessern

Verfasst: 15.10.2009 14:45
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

Re: Image mit Stretchblt vergroessern

Verfasst: 15.10.2009 15:07
von UdBel
Hi,

perfekt!

Vielen Dank!
VG
Udo

Re: Image mit Stretchblt vergroessern

Verfasst: 15.10.2009 15:09
von bobobo
nicht ganz perfekt

ich hab da noch ein float reingebastelt damit das AnzeigeQuadrat auch korrekt erscheint.