Seite 1 von 1

Bild drehen und Speichern

Verfasst: 30.07.2012 16:27
von alen
Hallo Community,

mal wieder hänge ich an einer Kleinigkeit fest und sehe den Wald vor lauter Bäumen nicht.
Vielleicht kann mir von Euch jemand einen Stubs verpassen.

Ich würde gerne ein Bild drehen und dann anschliessend abspeichern. Das mit dem drehen klappt ja soweit und man kann das Ergebnis in einem Imagegadget ausgeben aber das mit dem Speichern will nicht. Wo ist hier mein Denkfehler ?

Der Originale Code stammt hier aus dem Forum ich habe den nur ein wenig umgearbeitet da ich nicht so gerne mit #PB_Any arbeite.

Original Beitrag: http://www.purebasic.fr/german/viewtopic.php?p=225337

Vielen Dank für jegliche Tipps.

Grüße
Alen

Code: Alles auswählen

; Bild drehen per API PlgBlt_
; Original source at:
; http://www.purebasic.fr/german/viewtopic.php?p=225337

EnableExplicit

Procedure rotate(Image.l,rl.s)
  Enumeration
    #tmp_image
    #new_image
  EndEnumeration
  
  Protected hh.w, br.w, tmp.l, dc.l, imgnr.l
  
  Dim p.point(2)
  hh = ImageHeight(Image): br = ImageWidth(Image) 
  
  If hh > br
    tmp = CreateImage(#tmp_image,hh,hh)
  Else
    tmp = CreateImage(#tmp_image,br,br)
  EndIf
  
  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
  
  dc = StartDrawing(ImageOutput(#tmp_image))
    DrawImage(ImageID(Image),0,0)
    PlgBlt_(dc,p(),dc,0,0,br,hh,0,0,0)
  StopDrawing()
  
  imgnr = GrabImage(#tmp_image,#new_image,0,0,hh,br)
  FreeImage(#tmp_image)
  
  ProcedureReturn imgnr
EndProcedure


Enumeration
  #window
  #button_l
  #button_r
  #imageGadget
  #input_image
EndEnumeration


Define.l imgnr, Event, welcherButton

UseJPEGImageDecoder()

OpenWindow(0,0,0,850,700,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(#button_l, WindowWidth(0) - 100, 10, 80, 25, "Links")
ButtonGadget(#button_r, WindowWidth(0) - 100, 40, 80, 25, "Rechts")


LoadImage(#input_image,"D:\PICT0015.JPG")
ImageGadget(#imageGadget,0,0,0,0,ImageID(#input_image))
   
Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu
    welcherButton = EventGadget() 
    
    Select welcherButton
      Case #button_l
        imgnr = rotate(#input_image, "links")
        SetGadgetState(#imageGadget, imgnr)
        SaveImage(imgnr, "d:\test.jpg", #PB_ImagePlugin_JPEG)
      Case #button_r
         imgnr = rotate(#input_image, "rechts")
         SetGadgetState(#imageGadget, imgnr)
        SaveImage(imgnr, "d:\test.jpg", #PB_ImagePlugin_JPEG)
    EndSelect     
  EndIf
  
Until Event = #PB_Event_CloseWindow
End

Re: Bild drehen und Speichern

Verfasst: 30.07.2012 16:40
von STARGÅTE

Code: Alles auswählen

  imgnr = GrabImage(#tmp_image,#new_image,0,0,hh,br)
  FreeImage(#tmp_image)
  
  ProcedureReturn imgnr
EndProcedure
An dieser Stelle gibst du die ImageID und nicht die ImageNummer zurück, deswegen kann der Befehl

Code: Alles auswählen

        imgnr = rotate(#input_image, "rechts")
         SetGadgetState(#imageGadget, imgnr)
        SaveImage(imgnr, "d:\test.jpg", #PB_ImagePlugin_JPEG)
nicht richtig arbeiten.

Du solltest unbedingt, wieder die Any-Variante benutzen sonst kommst du mit deinem Code nicht weit.
Denn u.a. würdest du mit deinem Bild jedes mal das Image 0 und 1 löschen, weil du diese in deiner Procedure überschreibst.
Nicht um sonst, wird der Code mit Any veröffentlich!