Bilder proportional skalieren

    • Offizieller Beitrag

    Ich möchte verschiedene Bilder (Höhe und Breite vorher nicht bekannt) in einem Pic-Control anzeigen lassen. Das Pic-Control soll eine feste Größe haben (im Beispiel 345x232 Pixel). Wenn man nun ein Bild dort anzeigen läßt, das kleiner oder größer als die festgelegten Abmessungen ist, dann wird es dort hinein skaliert. Allerdings mit den falschen Proportionen.
    Frage 1: Wie kann man ein Bild proportional richtig skalieren?
    Frage 2: Wie kann ich die Dimensionen (Höhe und Breite) von einer Bild-Datei auslesen?

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $p

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("My GUI picture", 500, 300, -1, -1) ; will create a dialog box that when displayed is centered

    [/autoit] [autoit][/autoit] [autoit]

    $p = GUICtrlCreatePic('', 5, 5, 345, 232)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetImage($p, @SystemDir & "\oobe\images\monitor2.gif")
    Sleep(2000)
    GUICtrlSetImage($p, @SystemDir & "\oobe\images\mslogo.jpg")

    [/autoit] [autoit][/autoit] [autoit]

    ; Run the GUI until the dialog is closed
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit]
  • Das proportionale Skalieren musst du mathematisch lösen, zum Auslesen der Höhe und Breite kann ich dir jetzt leider nichts sagen

    Edit1:
    Willst du z.B. ein Bild der Größe 800x600 so skalieren, dass die Breite höchstens 200 beträgt, so teilst du die 800 durch die 200 (800/200) und erhältst die Zahl 4.
    Um nun proportional zu skalieren teilst du die Höhe durch die zahl, die du bei der Obigen Rechnung rausbekommen hast (200/4) und weißt dann, dass das kleinere Bild 50 Pixel hoch sein muss

    • Offizieller Beitrag

    Ja, wie ich das mathematisch machen muss, weiss ich. Nur, wie mache ich das mit AutoIt? Also, mit welchen Befehlen kann ich ein Bild skalieren?

    Falls es da nichts in AutoIt gibt, kennt jemand ein kleines (DOS)-Programm, mit dem man die Dimensionen von Bildern auslesen kann? Dann könnte ich zumindest das Pic-Control entsprechend anpassen.

  • Du könntest das Control resizen und mit GDIPlus die Daten auslesen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $p
    Const $SS_REALSIZECONTROL = 0x40
    GUICreate("My GUI picture", 500, 300, -1, -1) ; will create a dialog box that when displayed is centered

    [/autoit] [autoit][/autoit] [autoit]

    $p = GUICtrlCreatePic('', 5, 5, 345, 232,$SS_REALSIZECONTROL)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetImage($p, @SystemDir & "\oobe\images\monitor2.gif")
    Sleep(2000)
    _ImageSetToCtrlREsized($p, @SystemDir & "\oobe\images\mslogo.jpg",234,234)

    [/autoit] [autoit][/autoit] [autoit]

    ; Run the GUI until the dialog is closed
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    Func _ImageSetToCtrlREsized($CtrlID,$FileName,$sizex,$sizey)
    _GDIPlus_Startup()
    Local $hImg = _GDIPlus_ImageLoadFromFile($FileName)
    Local $w = _GDIPlus_ImageGetWidth($hImg)
    Local $h = _GDIPlus_ImageGetHeight($hImg)
    _GDIPlus_ImageDispose($hImg)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    ; Höhe / Breite berechnen:
    $calcx = $w
    $calcy = $h
    ;Ende

    [/autoit] [autoit][/autoit] [autoit]

    ControlMove(_WinAPI_GetParent(GUICtrlGetHandle($CtrlID)),"",$CtrlID,Default,Default,$calcx,$calcy)
    GUICtrlSetImage($CtrlID,$FileName)
    EndFunc

    [/autoit]