Bildergröße auslesen und schneiden/etwas hinzufügen

  • Servus an alle,

    wer hatte das Problem nicht schon mal, man hat nen Uralt CRT, der den Geist aufgibt und kauft sich dann einen hübschen Widescreen TFT.
    Man schließt das Gerät an und was fällt gleich nach dem starten auf?!? Genau!!! Das Wallpaper ist verzehrt wie nochmal was.
    Meine Idee deswegen:
    Ein Programm in dem man die Bilddatei auswählen kann, die Größe dann ausliest und je nach dem was man will, oben und unten oder nur oben oder nur unten etwas wegschneidet oder an der linken und rechten Seite einen Rahmen oder irgendwas anderes hinzufügt, dass es vom 4:3 Format zum 16:10 anpasst ohne diese widerliche Verzerrung. ;)

    Problem bzw. meine Fragen für die Umsetzung:
    Wie liest man von einem Bild die Größe aus per AutoIT??
    Wie kann man ein Stück vom Bild wegschneiden, sagen wir mal von oben 10% oder so ohne ein anderes Prog zu benutzen?!?
    Wie ist es möglich, dass links und rechts vom Bild etwas hinzugefügt wird über AutoIT, z.Bsp. ein schwarzer Rand?!?
    (IrfanView oder andere Möglichkeiten zählen nicht, nur wenns wirklich nicht anders geht...)

    Hoffe ihr könnt mir da helfen, da ich in AutoIT von "Bildbearbeitung" (bissl größe gucken, bissl schnippln, bissl was schaffen eben :D ) keine Ahnung habe :( :(

    Einen schönen Abend noch

    Stormy

  • Schau dir mal in der Hilfe die _GDIPlus Sachen an, ich habe da grade mal nen bissel rumgesucht und gesehen, das man auf jeden Fall BMP und JPEG Dateien einlesen kann. Für die Größe gibt es da z. B. _GDIPlus_ImageGetWidth und _GDIPlus_ImageGetHeight, wenn man nun also das Bild einmal einliest und dann noch ein Grafikopbjekt erstellt, welches als Hintergrundfarbe schwarz hat und das Bild da zentriert einfügt (der schwarze Bereich sollte natürlich breiter sein) und man das Bild dann wieder abspeichert, sollte man es doch vergrößert haben. Ich habe leider keine Zeit um es selber zu probieren, bin aber mal auf die Vorschläge die sicher noch kommen werden gespannt :)

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

  • Hey ,danke für die schnelle Antwort, muss ich gleich mal ausprobieren sobald ich Zeit habe.
    Bin aber auch noch für mehr Vorschläge zu haben ;) Geizt nicht mit euren "Geheim"-Tipps ;)
    Haut sie raus, einfach mal ein bisschen brainstorming und ideen sammeln ^^
    gruß stormy

    Edit: Kann mir jmd sagen was ich falsch gemacht habe?!? Bei mir kommt immer folgende Fehlermeldung:
    G:\Programme\AutoIt3\Include\GDIPlus.au3 (1986) : ==> Subscript used with non-Array variable.:
    Return SetError($aResult[0], 0, $aResult[2])
    Return SetError($aResult^ ERROR
    >Exit code: 1 Time: 1.821
    bei folgenden Code:

    Spoiler anzeigen
    [autoit]

    #include < GDIPlus.au3 >
    _GDIPlus_ImageGetHeight("test.bmp")

    [/autoit]

    Einmal editiert, zuletzt von stormy (20. Februar 2008 um 20:49)

  • Probier mal so:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

    _GDIPlus_Startup ()

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

    $hBitmap = _GDIPlus_BitmapCreateFromFile ("test.bmp")
    $iX = _GDIPlus_ImageGetWidth ($hBitmap)
    $iY = _GDIPlus_ImageGetHeight ($hBitmap)

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

    MsgBox(64,"Info","Höhe: " & $iy & @LF & "Breite: " & $iX)
    _GDIPlus_ImageDispose ($hBitmap)
    _WinAPI_DeleteObject ($hBitmap)
    _GDIPlus_ShutDown ()

    [/autoit]

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

  • Danke für die Hilfe,
    funktioniert jetzt, gibts da eigentlich irgendwo eine Hilfedatei, damit man weiß wie man mit der gdiplus.au3 include umgehen muss?!?
    Hab zwar jetzt das hier gefunden, aber ist halt englisch und im ersten moment bzw. beim ersten mal lesen nicht unbedingt verständlich ^^
    (Da steht irgendwas von, dass man das Bild vorher als Object laden muss, da es eine Datei nicht lesen kann oder so)

    grüße stormy

    edit: hab festgestellt, dass einiges bzw. eigentlich alles kommentiert ist ;)

    Spoiler anzeigen

    Call _GDIPlus_Startup BEFORE you create any GDI+ objects. GDI+ requires a redistributable for applications that run on the Microsoft Windows NT 4.0 SP6, Windows 2000, Windows 98, and Windows Me operating systems.

    Beschreibung von _GDIPlus_ImageGetHeight
    $hImage - Handle to an image OBJECT

    Der Befehl macht ein Objekt aus eurem File:
    _GDIPlus_BitmapCreateFromFile
    When you are done with the Bitmap object, call _WinAPI_DeleteObject to release the resources

    _GDIPlus_ShutDown ()
    schließt die dll datei wieder bzw. die gdiplus

    _WinAPI_DeleteObject ($hBitmap)
    Bereinigt resources (siehe auch _GDIPlus_BitmapCreateFromFile)

    nur _GDIPlus_ImageDispose ist mir noch unklar, für was das gut ist, dein code funktioniert auch ohne das und ohne #include <GuiConstantsEx.au3> ;)

    Einmal editiert, zuletzt von stormy (20. Februar 2008 um 21:20)

  • Ok, so gehts auch, hatte in der deutschen geschaut und vergessen in der englischen Hilfe zu schauen (Schande über mein Haupt) :rolleyes: , aber bin in der gdiPlus.au3 datei dann fündig geworden, auch wenn spärlich ^^ Danke!

    grüße stormy

  • Hi nochma,

    Was mich bei den Hilfedateien sowieso wundert ist,
    dass selbst in der englischen UDF datei die Befehle nicht drin sind ;)
    Versteh das System da nicht so ganz :)

    greetz

  • Du meinst wenn man in die .chm datei direkt reingeht so wie ich immer ?!?! ;)
    Jo da sind die _GdiPlus_ befehle nicht drin, aber über die .exe schon 0o
    Kann es sein, dass du dich mit gdiplus funktione gut auskennst?
    Also wenn ja, könntest mir dann sagen welche der 97 gdi Funktionen ich zum wegschneiden von bestimmten Postionen bzw. zum hinzufügen von nen schwarzen rand links und rechts ich brauche ?!? Danke im Voraus.

    Grüße zurück aus Bayrn :D :D

  • Hi,

    tut mir leid ich kenn mich garnicht mit GDI aus :(
    so 0 xD würd dir gerne helfen ;) aber hab echt 0 plan.
    Jenachdem obs mir morgen besser geht kann ich mich allerdings mal damit beschäftigen^^

    lG

  • Ich habe mal folgendes gemacht:
    Mein Notebook hat eine Auflösung von 1680x1050, die Bilder bei C`t gibt es z. B. in 1600x1200, also wenn ich das nehmen würde, würde es als Hintergrundbild gezogen und gequätscht.
    In dem Skript wird ein Bild von der Seite von C`t runter geladen, anschliessend wird es in ein neues Bild geladen, welches oben und unten ein Stück weg genommen hat und links bzw. rechts einen schwarzen Rand angefügt hat.

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>

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

    Local $Url = "http://www.heise.de/ct/motive/07/21/p1600.jpg"
    Local $target = "bigpic.jpg"
    Local $result = "newbigpic.jpg"

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

    _LoadPic()
    _ResizePic()

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

    Func _LoadPic()
    If InetGet($Url,$target) = 0 Then
    MsgBox(48,'Fehler','Konnte Datei nicht laden.')
    Exit
    EndIf
    EndFunc

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

    Func _ResizePic()
    $hBMP = _ScreenCapture_Capture ("") ; ein Bild erstellen

    _GDIPlus_Startup() ;GDI starten

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

    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ($hBMP) ;den Screenshot ladden
    $hImage2 = _GDIPlus_ImageLoadFromFile($target) ; das zu bearbeitende Bild laden
    $hGraphics = _GDIPlus_ImageGetGraphicsContext ($hImage1) ;Gafikopjekt erstellen
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0, @DesktopWidth, @DesktopHeight) ; schön schwarz anmalen
    _GDIPlus_GraphicsDrawImage ($hGraphics, $hImage2,40, -75) ;das Bild einfügen
    $sCLSID = _GDIPlus_EncodersGetCLSID ("JPG") ;so kann das Bild als jpeg gespeichert werden
    _GDIPlus_ImageSaveToFileEx ($hImage1,$result,$sCLSID)

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

    ;aufräumen :)
    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_ImageDispose ($hImage2)
    _WinAPI_DeleteObject ($hBMP)
    _GDIPlus_GraphicsDispose($hGraphics)

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

    _GDIPlus_ShutDown () ; GDI beenden
    EndFunc

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

    Falls sich jemand Fragen sollte wie ich auf die 40 bzw. -75 gekommen bin:
    (1680 - 1600) / 2 = 40
    (1050 - 1200) / 2 = -75

    Hier noch eine Version, die holt sich wieder das Bild von der C`t aber das 1024x768er und vergrössert es auf 1400x1050 uns setzt nur die Balken an der Seite, so muss nix abgeschnitten werden:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>

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

    Local $Url = "http://www.heise.de/ct/motive/07/21/p1024.jpg"
    Local $target = "bigpic.jpg"
    Local $result = "newbigpic.jpg"

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

    _LoadPic()
    _ResizePic()

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

    Func _LoadPic()
    If InetGet($Url,$target) = 0 Then
    MsgBox(48,'Fehler','Konnte Datei nicht laden.')
    Exit
    EndIf
    EndFunc

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

    Func _ResizePic()
    $hBMP = _ScreenCapture_Capture ("") ; ein Bild erstellen

    _GDIPlus_Startup() ;GDI starten

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

    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ($hBMP) ;den Screenshot ladden
    $hImage2 = _GDIPlus_ImageLoadFromFile($target) ; das zu bearbeitende Bild laden
    $hGraphics = _GDIPlus_ImageGetGraphicsContext ($hImage1) ;Gafikopjekt erstellen
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0, @DesktopWidth, @DesktopHeight) ; schön schwarz anmalen
    _GDIPlus_GraphicsDrawImageRectRect ($hGraphics, $hImage2, 0, 0, 1024, 768, 90, 0, 1400, 1050)
    ;~ _GDIPlus_GraphicsDrawImage ($hGraphics, $hImage2,40, 0) ;das Bild einfügen
    $sCLSID = _GDIPlus_EncodersGetCLSID ("JPG") ;so kann das Bild als jpeg gespeichert werden
    _GDIPlus_ImageSaveToFileEx ($hImage1,$result,$sCLSID)

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

    ;aufräumen :)
    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_ImageDispose ($hImage2)
    _WinAPI_DeleteObject ($hBMP)
    _GDIPlus_GraphicsDispose($hGraphics)

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

    _GDIPlus_ShutDown () ; GDI beenden
    EndFunc

    [/autoit]

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

    Einmal editiert, zuletzt von McPoldy (21. Februar 2008 um 14:27)

  • Thx, so was ungefähr hab ich gesucht, werde es mal am Wochende genau analysieren, dann die einzelnen Funktionen anschauen und dann auf mein Prog anwenden.
    Aber wie schon gesagt, leider erst am Wochende, habe grad einiges um die Ohren. :( :(

    gruß stormy

    edit: 1680x1050 auflösung bei notebook?!?! entweder du hast ein 22" widescreen notebook oder du machst dir über die Jahre die Augen kaputt...

    Einmal editiert, zuletzt von stormy (21. Februar 2008 um 15:52)

  • Abend an alle,
    mein kleines Programm müsste jetzt fertig sein. ;)

    Das Programm macht momentan jetzt folgendes:
    Ihr habt haufenweise Bilder mit Format 1024x768 also 4:3.
    Nun habt ihr jetzt aber einen Widescreen und wollt trotzdem die Bilder unverzerrt sehen.
    Widescreen hat Format z.bsp. von 1680x1050 also 16:10.

    Mein Prog macht da jetzt folgendes:
    Es nimmt das Bild und checkt erstmal die Weite und Höhe. Daraus entsteht dann der Faktor, bei 4:3 wären es 1.333...
    Dann schaut er die momentane Auflösung an, also bei WIdescreen 16:10 wäre der Faktor 1,6.
    Nun verrechnet er diese beiden Werte um die Größe des neuen Bildes herauszubekommen und wieviel Differenz bzw. Rand es außen braucht, dass das Bild nicht mehr verzerrt ist.
    Die ganzen Daten wendet er jetzt an, indem er zuerst einen Screenshot macht mit den Werten des neuen Bildes, dann dieses schwarz einfärbt und in die Mitte das eigentliche Bild einfügt, so dass ein schwarzer Rand entstanden ist, danach kommt nur noch ein Dialog zum Speichern und das entrümpeln/entlasten der benutzen Funktionen.

    Viel Spaß mit dem Prog.

    Mfg Stormy

    Als .7z Paket hochgeladen, .exe+.au3:
    WMICodeCreator.zip

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>

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

    ;Dateiauswahl bzw. Bildauswahl
    $path = FileOpenDialog ("Bild auswählen",@DesktopDir,"Bilder im .jpg Format (*.jpg)",1)
    If $path = "" Then Exit

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

    ;GDI starten
    _GDIPlus_Startup ()
    ;Laden des ausgewählten Bildes
    $hBitmap = _GDIPlus_BitmapCreateFromFile ($path)
    ;Werte auslesen
    $width_p = _GDIPlus_ImageGetWidth ($hBitmap)
    $height_p = _GDIPlus_ImageGetHeight ($hBitmap)
    ;faktor bild wird festgestellt, z. bsp. 16:10 = 1.6 und 4:3 = 1.3333
    $form_p = $width_p/$height_p

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

    $height = @DesktopHeight
    $width = @DesktopWidth
    ;faktor der aktuellen Auflösung wurde eingelesen
    $form_d = $width/$height

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

    ;Veränderungsfaktor wird erstellt
    $fakt = $form_d/$form_p

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

    ;Größe mit schwarzem Rand wird errechnet und Differenz zu momentanten Werten
    $width_pn = $width_p*$fakt
    $diff_w = $width_pn-$width_p

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

    $hBMP = _ScreenCapture_Capture ("",0,0,$width_pn,$height_p) ; Screenshot für schwaren Rand

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

    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ($hBMP) ;Laden des Screenshot
    $hImage2 = _GDIPlus_ImageLoadFromFile($path) ; Laden des ausgewählten Bildes
    $hGraphics = _GDIPlus_ImageGetGraphicsContext ($hImage1) ;Gafikobjekt (das Eigentliche Bild) erstellen
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0, @DesktopWidth, @DesktopHeight) ; Screenshot wird schwarz angemalt
    _GDIPlus_GraphicsDrawImage ($hGraphics, $hImage2,$diff_w/2,0) ;Bild wird in den Screenshot gesetzt
    $sCLSID = _GDIPlus_EncodersGetCLSID ("JPG") ; Abspeichermöglichkeit als .jpg
    $pfad_s = FileSaveDialog("Speicherort auswählen",@desktopdir,"Bilder (*.jpg)") ;Pfad und Dateiname werden eingegeben
    _GDIPlus_ImageSaveToFileEx ($hImage1,$pfad_s,$sCLSID) ;Speichervorgang an sich

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

    ;closen der aufgemachten Sachen
    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_ImageDispose ($hImage2)
    _WinAPI_DeleteObject ($hBMP)
    _GDIPlus_GraphicsDispose($hGraphics)

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

    _GDIPlus_ShutDown () ; GDI beenden

    [/autoit]