Seite 1 von 2

ImageResize unter Einbehaltung des Seitenverhältnisses

Verfasst: 05.06.2006 12:49
von Slut-Hunter
Hi

Wie die Überschrift schon sagt, such ich ne Möglichkeit ein Bild so zu resizen das das Seitenverhältniss einbehalten wird.

Hab nenn Code Schnipsel ergoogelt doch den blick ich nicht(generell noch kein Plan von Prozeduren, wo sie hinkommen usw), was mir viel mehr nützen würde, währe die Formel
mit der man das Berechnet.

Code: Alles auswählen

;This is the aparently magic yet so easy way to do it
;I use this to get the proper width/height for image resizing and movie resizing etc.
Procedure AspectSize(source_w,source_h,*dest_w,*dest_h)
Protected aspect.f,w.l,h.l,width.l,height.l
 If source_w=0 Or source_h=0 Or *dest_w=0 Or *dest_h=0 : ProcedureReturn : EndIf

 width=PeekL(*dest_w)
 height=PeekL(*dest_h)

 aspect.f=source_w/source_h

 w.l=width
 h.l=width/aspect
 If h>height
  w=height*aspect
  h=height
 EndIf

 PokeL(*dest_w,w)
 PokeL(*dest_h,h)
EndProcedure


;Example use code grabbed from a recent forum post, and slightly modified.
If OpenWindow(0,300,30,600,400,#PB_Window_SystemMenu,"test")
  UseJPEGImageEncoder()
  CreateGadgetList(WindowID())
   ImageGadget(0,0,0,WindowWidth(),WindowHeight(),0)
  Repeat
    ev=WindowEvent()
    If GetAsyncKeyState_(#VK_SNAPSHOT)<>0 : If ev=0 : Delay(1) : EndIf
      GetWindowRect_(GetForegroundWindow_(),win.RECT)
      x=win\left : y=win\top : w=win\right-win\left : h=win\bottom-win\top
      dm.DEVMODE : srcDC=CreateDC_("DISPLAY","","",dm) : trgDC=CreateCompatibleDC_(srcDC)
      bm=CreateCompatibleBitmap_(srcDC,w,h) : SelectObject_(trgDC,bm) : BitBlt_(trgDC,0,0,w,h,srcDC,x,y,#SRCCOPY)
      DeleteDC_(trgDC) : ReleaseDC_(bm,srcDC) : CreateImage(0,w,h)
      StartDrawing(ImageOutput()) : DrawImage(bm,0,0) : StopDrawing()
      w_new.l=WindowWidth()
      h_new.l=WindowHeight()
      AspectSize(w,h,@w_new,@h_new)
      ResizeImage(0,w_new,h_new)
      SetGadgetState(0,UseImage(0))
      Delay(500)
    EndIf
  Until ev=#PB_EventCloseWindow
EndIf 
Bei diesem Code Schnipsel hab ich keine Ahnung, wo was welche ID hat(geschweige den welche ID das Bild nun hat), der Gesammte Aufbau ist für mich Noob unverständlich, mehrere Befehle pro Zeile bringen mich durcheinander auch wenn es platzsparend sein mag.


Hab aus nem uralt Tut gelernt, und mir alles ohne Enumeration angewöhnt, d:h ist meine Syntax extrem Noob mäßig.

Code: Alles auswählen

If OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered,"BlaBla ")

UseJPEGImageEncoder() 
UseJPEGImageDecoder() 

CreateGadgetList(WindowID(0)) 
LoadImage(0, "C:\test.jpg")

ButtonGadget(20,200,10,100,20,"Start") 

CloseGadgetList()

Repeat 
     
EventID = WaitWindowEvent()

If EventID = #PB_Event_Gadget 

If EventGadgetID()=20

ImageGadget(1, 10, 30, 400, 300,UseImage(0))

Breite = ImageWidth() 
Hoehe= ImageHeight()


W_1 = ImageWidth() 
H_1 = ImageHeight()

If Breite < 1000
Hanso1=W_1
Else
Hanso1=Breite/4
EndIf

If Hoehe < 750 
Hanso2=H_1
Else
Hanso2=Hoehe/3
EndIf

CopyImage(0, 10)

ResizeImage(10, Hanso1, Hanso2)

SaveImage(10, "C:\RESIZE.jpg", #PB_ImagePlugin_JPEG, 10)
EndIf

EndIf

Until EventID = #PB_Event_CloseWindow 
   
EndIf 
  
End

Verfasst: 05.06.2006 13:03
von Kaeru Gaman
für resizen auf neue breite:

Code: Alles auswählen

Procedure Img_Proport_Resize( Image_Nr.l, New_Width.f )

  Width.f = ImageWidth(Image_Nr)
  Height.f = ImageHeight(Image_Nr)

  New_Height.f = Height / Width * New_Width

  ResizeImage( Image_Nr, New_Width, New_Height )

EndProcedure
für neue höhe eben analog die faktoren tauschen.

das ist ein simples mathematisches problem, doppelter dreisatz, sonst nix.
das braucht man nicht gleich mit siebenunddreißig features erschlagen.

[edit] hatte die argumente bei ImageHeight/Widht vergessen. korrigiert.

Verfasst: 05.06.2006 13:10
von Slut-Hunter
Danke :) damit kann ich schon eher was anfangen :allright:

Nur noch eine Frage, zu Prozeduren, muss man die generell ganz oben hinmachen ?

Verfasst: 05.06.2006 13:31
von Kiffi
> Nur noch eine Frage, zu Prozeduren, muss man die generell ganz oben
> hinmachen ?

kann man, muss man nicht. Zu beachten ist, dass wenn Du eine Prozedur
unterhalb des Aufrufes positionierst, diese mit 'Declare' deklariert werden muss.

also entweder so:

Code: Alles auswählen

; Prozedur steht unterhalb des Aufrufes -> Declare verwenden

Declare Test(Parameter.l)

Test(42)

Procedure Test(Parameter.l)
EndProcedure
oder so:

Code: Alles auswählen

; Prozedur steht oberhalb des Aufrufes -> Kein Declare nötig

Procedure Test(Parameter.l)
EndProcedure

Test(42)
Grüße ... Kiffi

Verfasst: 05.06.2006 13:34
von Slut-Hunter
Danke für den Hinweis, jetzt blick ich das schon etwas besser durch :)

Verfasst: 05.06.2006 13:49
von Macros
Suchfunktion hätte auch geholfen:
http://www.purebasic.fr/german/viewtopic.php?t=8178

Verfasst: 05.06.2006 13:52
von DarkDragon
Programmieren ist wie Bücherlesen. Du kannst auch nur das wissen, was du bereits gelesen hast. Und du liest von vorne nach hinten und nicht quer per Zufall gesteuert.

Verfasst: 05.06.2006 14:04
von Kaeru Gaman
Macros hat geschrieben:Suchfunktion hätte auch geholfen:
http://www.purebasic.fr/german/viewtopic.php?t=8178
nach welchen begriffen haste denn gesucht?

aus. sitz. böser kaeru.

schon gut, forget it.

Verfasst: 05.06.2006 14:06
von Macros
Gesucht habe ich nach
Breite und
Autor=Macros, weil ich wusste das ein Beitrag von mir drinnen ist ;-)

Verfasst: 05.06.2006 14:13
von Kaeru Gaman
also kannst du nicht behaupten
> Suchfunktion hätte auch geholfen:

mit suchbegriff "ImageResize" finde ich den thread nicht.

ich persönlich hab auch meine last beim nutzen der suchfunktion in diesem forum.
hey, hör auf.
die gesamtdatenmenge ist zu groß, entweder ich finde zu viele treffer oder zu wenig.
ist bald gut? das bringt doch nix.
ich finde, die suchfunktion des boards is fürn ar$ch.
ok, ich bin weg, bade das alleine aus.
ich benutze sie so gut wie nie. wenn man nicht zufällig passende schlagworte im hinterkopf hat, weil man was sucht was man schon gelesen hat, kann mans vergessen.