ImageResize unter Einbehaltung des Seitenverhältnisses

Anfängerfragen zum Programmieren mit PureBasic.
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

ImageResize unter Einbehaltung des Seitenverhältnisses

Beitrag 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
Zuletzt geändert von Slut-Hunter am 05.06.2006 13:21, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Zuletzt geändert von Kaeru Gaman am 05.06.2006 13:40, insgesamt 2-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag 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 ?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag von Slut-Hunter »

Danke für den Hinweis, jetzt blick ich das schon etwas besser durch :)
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Suchfunktion hätte auch geholfen:
http://www.purebasic.fr/german/viewtopic.php?t=8178
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Gesucht habe ich nach
Breite und
Autor=Macros, weil ich wusste das ein Beitrag von mir drinnen ist ;-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten