Bild drehen und Speichern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Bild drehen und Speichern

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bild drehen und Speichern

Beitrag 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!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten