Adimos: Skript/Software zum rekursiven Batch von Bildern mittels convert

Hallo.

Ich habe ein Haufen zu großer Bilder auf meinem Webspace. Die möchte ich jetzt verkleinern. Natürlich möchte ich dazu ImageMagick's convert benutzen.
Doch der kann afaik von Haus aus nicht rekursiv handeln. Dazu suche ich jetzt ein Shell-Skript oder (wenn es das gibt) sogar eine GUI, die alle meine Bilder rekursiv verkleinern kann.
Leider kann ich kein sh und möchte es nicht lernen, nur weil ich diese eine Aufgabe erledigt haben möchte.

Gibt es solche fertigen empfehlenswerten Skripts und/oder GUIs?

Vielen Dank
Adimos

  1. Hallo Adimos.

    Ich habe ein Haufen zu großer Bilder auf meinem Webspace. Die möchte ich jetzt verkleinern. Natürlich möchte ich dazu ImageMagick's convert benutzen.
    Doch der kann afaik von Haus aus nicht rekursiv handeln. Dazu suche ich jetzt ein Shell-Skript oder (wenn es das gibt) sogar eine GUI, die alle meine Bilder rekursiv verkleinern kann.

    Mit Hilfe von find ließe sich dies recht einfach gestalten:

    $ find -name *.jpg -exec mogrify -resize 50% {} \;

    Dieses kleine Kommando verkleinert sämtliche JPEG-Grafiken im aktuellen Verzeichnis und seinen Unterverzeichnissen um die Hälfte. Ich gehe davon aus, dass dir die Kommandozeilenparameter der ImageMagick-Tools bereits vertraut sind.

    Einen schönen Samstag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
    1. Hi

      $ find -name *.jpg -exec mogrify -resize 50% {} \;

      Dieses kleine Kommando verkleinert sämtliche JPEG-Grafiken im aktuellen Verzeichnis und seinen Unterverzeichnissen um die Hälfte.

      Um die Hälfte zu verkleinern wäre in meinem Fall unvorteilhaft. Gibt es bei find auch die Möglichkeit einer Höhenangabe? Ich hätte nämlich gerne alle Bilder auf 480px Höhe, die Breite soll dann im Verhältnis mit kleiner werden (ich habe unterschiedlich hohe und breite Bilder).

      Ich gehe davon aus, dass dir die Kommandozeilenparameter der ImageMagick-Tools bereits vertraut sind.

      Nicht von allen, aber mit convert habe ich schon häufiger gearbeitet. Ich arbeite aber nicht so häufig (quasi gar nicht) mit dem Rest.

      Danke
      Adimos

      1. Hallo Adimos.

        $ find -name *.jpg -exec mogrify -resize 50% {} \;

        Dieses kleine Kommando verkleinert sämtliche JPEG-Grafiken im aktuellen Verzeichnis und seinen Unterverzeichnissen um die Hälfte.

        Um die Hälfte zu verkleinern wäre in meinem Fall unvorteilhaft. Gibt es bei find auch die Möglichkeit einer Höhenangabe?

        Nein, da find nichts mit dem Verkleinern zu tun hat. Es führt lediglich das Kommando welches für den Parameter „exec“ spezifiziert wurde aus. In diesem Fall eben ImageMagicks „mogrify“.

        Ich hätte nämlich gerne alle Bilder auf 480px Höhe, die Breite soll dann im Verhältnis mit kleiner werden (ich habe unterschiedlich hohe und breite Bilder).

        Die Doku zur „resize“-Option verrät dir, was du brauchst:

        […] if only the height is specified (e.g., -resize x256, the width is chosen to maintain the aspect ratio.

        Wenn du nun noch zwischen Hoch- und Querformat unterscheiden möchtest, musst du das find-Kommando zwei mal aufrufen:

        $ find -name \*.jpg -exec mogrify -resize "x640>" {} \;  
        $ find -name \*.jpg -exec mogrify -resize "640x>" {} \;
        

        Ich gehe davon aus, dass dir die Kommandozeilenparameter der ImageMagick-Tools bereits vertraut sind.

        Nicht von allen, aber mit convert habe ich schon häufiger gearbeitet. Ich arbeite aber nicht so häufig (quasi gar nicht) mit dem Rest.

        Das „mogrify“-Tool ist praktisch das gleiche wie „convert“, nur mit dem Unterschied, dass hierbei die Quelldateien direkt bearbeitet werden.

        Einen schönen Samstag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
  2. Hallo Adimos,

    soll die Verkleinerung auf dem Server geschehen oder geht es auch lokal auf dem Rechner?

    MfG,
    Hartmut R.

    1. Hi

      soll die Verkleinerung auf dem Server geschehen oder geht es auch lokal auf dem Rechner?

      Das soll auf dem Rechner geschehen. Es handelt sich um mehrere hundert Bilder, das würde die CPU des Webservers nur belasten.

      Adimos

      1. Hallo Adimos,

        Das soll auf dem Rechner geschehen. Es handelt sich um mehrere hundert Bilder, das würde die CPU des Webservers nur belasten.

        Ein paar hundert Bilder? Und dafür durchforstest Du das Web nach Lösungen?
        Also die allereinfachste Lösung, die auch jeder DAU kann: Nimm ein brauchbares Bildbearbeitungsprogramm, zeichne mit dem "Script-Recorder" eine Bildbearbeitungsequenz auf, rufe das Dialogfeld "Batchverarbeitung" auf, füge Dateien und Script hinzu und Klicke auf "Wiedergeben".

        MfG,
        Hartmut R.

        1. Hi

          Ein paar hundert Bilder? Und dafür durchforstest Du das Web nach Lösungen?

          Na klar, oder willst du meine 634 Bilder (das ist die exakte Summe, hab gerade zählen lassen) einzeln von Hand verkleinern?

          Also die allereinfachste Lösung, die auch jeder DAU kann: Nimm ein brauchbares Bildbearbeitungsprogramm, zeichne mit dem "Script-Recorder" eine Bildbearbeitungsequenz auf, rufe das Dialogfeld "Batchverarbeitung" auf, füge Dateien und Script hinzu und Klicke auf "Wiedergeben".

          Äh, wie jetzt? Bilder wiedergeben?

          Les doch mal mein Anliegen genauer: Ich suche Skripts (und auch Software!), die alle meine Bilder rekursiv verkleinern kann. Und welches Programm schlägst du mir vor? Ich kenne den Script-Recorder nicht, was und wo ist das?
          Als Bildbearbeitung habe ich Gimp 2.2 (vorzugsweise) und Inkscape (Vektor) auf meinem PC. Hinzufügen neuer Programme wäre kein Problem, solang sie im apt paketiert sind (auch unfreie Software ist freigeschalten), oder frei als Sourcen für Linux zur Verfügung stehen.

          Danke
          Adimos

          1. Hi Adimos,

            wenn ich es recht verstanden habe, möchtest Du Grafiken (JPG und GIF) verkleinern, die Höhe gibst Du vor, das Verhältnis zur Breite soll erhalten bleiben.
            Bildbearbeitungsprogramme haben für sowas einen Batchmodus. Scripte kannst Du aufzeichnen oder aber, wenn anspruchsvollere Geschichten, selbst schreiben.
            Mit Gimp kenne ich mich nicht aus, habs aber mal auf meiner Kiste installiert, weil ich neugierig war. Ich geh da jetzt mal rein und suche für Dich, OK?

            MfG,
            Hartmut R.

            1. Hi Adimos,

              Gimp hab ich nicht mehr, wohl irgendwann wieder deinstalliert. Inkscape habe ich zwar drauf, aber das ist als Vektorprogramm für Dein Anliegen nicht geeignet.
              Schau doch mal bitte selbst im Gimp, nimm als Suchbegriff "Batchverarbeitung" oder "Stapelverarbeitung" oder "Recorder" oder "Script aufzeichnen" oder so was.

              MfG,
              Hartmut R.

              1. Hi Adimos,

                Schau doch mal bitte selbst im Gimp, nimm als Suchbegriff "Batchverarbeitung" oder "Stapelverarbeitung" oder "Recorder" oder "Script aufzeichnen" oder so was.

                Hab mir jetzt mal die Mühe gemacht. Unter
                http://www.gimp.org/tutorials/Basic_Batch/
                kannst Du nachlesen, wie es geht.
                Andere Programe können das allerdings einfacher.
                Photoshop oder Corel-Photopaint z.B. Wobei ich persönlich Photopaint bevorzuge, auch wenn so manche jetzt die Nase rümpfen.

                MfG,
                Hartmut R.

  3. Ich habe jetzt, ganz versteckt, im Internet folgendes (von mir abgewandelten) Skriptsnippet gefunden (der noch nicht rekursiv ist, ich weiß):

    for $f in *.jpg
    do convert $f -resize "640x>" small/$f.jpg
    done

    was aber nicht so wirklich funktionieren will, weil "./batch.sh: line 3: `$f': not a valid identifier", was auch immer das heißen mag.

    Wo liegt der Fehler in dem Skript? Denn der Code, der ausgeführt wird, also "convert blabla", funktioniert, wenn ich ihn einfach in der Konsole eingebe.

    Danke
    Adimos

    1. Hallo Adimos.

      Ich habe jetzt, ganz versteckt, im Internet folgendes (von mir abgewandelten) Skriptsnippet gefunden (der noch nicht rekursiv ist, ich weiß):

      Was stört dich an meinem Lösungsvorschlag?

      for $f in *.jpg
      do convert $f -resize "640x>" small/$f.jpg
      done

      was aber nicht so wirklich funktionieren will, weil "./batch.sh: line 3: `$f': not a valid identifier", was auch immer das heißen mag.

      Dass „$f“ kein gültiger Variablenname ist. Es müsste wie folgt aussehen:

      for f in *.jpg  
        do convert "$f" -resize "640x>" "small/$f.jpg"  
      done
      

      Wo liegt der Fehler in dem Skript? Denn der Code, der ausgeführt wird, also "convert blabla", funktioniert, wenn ich ihn einfach in der Konsole eingebe.

      Was den Schluss nahe legen würde, dass etwas am Schleifenkonstrukt nicht stimmt.

      Einen schönen Samstag noch.

      Gruß, Mathias

      --
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
      debian/rules
      1. Hi

        Was stört dich an meinem Lösungsvorschlag?

        Eigentlich nichts [1], ich versuche nur mehrere Lösungsmöglichkeiten, vielleicht funktioniert die ein ja besser als die andere, oder ist mir sympatischer.

        was aber nicht so wirklich funktionieren will, weil "./batch.sh: line 3: `$f': not a valid identifier", was auch immer das heißen mag.
        Dass „$f“ kein gültiger Variablenname ist. Es müsste wie folgt aussehen:

        for f in *.jpg

        do convert "$f" -resize "640x>" "small/$f.jpg"
        done

          
        Cool, danke, das funktioniert. Aber leider nur auf \*.jpg-Endungen. Ich habe aber auch etliche Dateien, die \*.JPG heißen. Wie bekomme ich die noch in diese Schleife?  
        Und wenn ich das Ding jetzt noch rekursiv hinkriegen kann, dann hätte ich meine Lösung.  
          
        [1] ... bis auf die Fehlermeldung "find: Fehlendes Argument für "-exec".", wobei ich nicht verstehe, warum find dort keine Kommando sieht (ich gebe zu, ich hab deinen Code kaum erwähnenswert geändert: "find -name \\*.jpg - exec convert -resize "480x>"". Aus dem Grund, da ich die Bilder in Originalgröße noch behalten will).  
        Zur Verständnis: Der im Parameter exec angegebene Code wird auf jede Datei, die find findet, ausgeführt?  
          
          
        Danke  
        Adimos
        
        1. Hallo Adimos.

          was aber nicht so wirklich funktionieren will, weil "./batch.sh: line 3: `$f': not a valid identifier", was auch immer das heißen mag.
          Dass „$f“ kein gültiger Variablenname ist. Es müsste wie folgt aussehen:

          for f in *.jpg

          do convert "$f" -resize "640x>" "small/$f.jpg"
          done

          
          >   
          > Cool, danke, das funktioniert. Aber leider nur auf \*.jpg-Endungen. Ich habe aber auch etliche Dateien, die \*.JPG heißen. Wie bekomme ich die noch in diese Schleife?  
            
          Indem du an Stelle von „\*.jpg“ „\*.[jJ][pP][gG]“ verwendest.  
            
          
          > [1] ... bis auf die Fehlermeldung "find: Fehlendes Argument für "-exec".", wobei ich nicht verstehe, warum find dort keine Kommando sieht (ich gebe zu, ich hab deinen Code kaum erwähnenswert geändert: "find -name \\*.jpg - exec convert -resize "480x>"".  
            
          Da fehlt sowohl der Platzhalter für die gefundene Datei („{}“), als auch der Programmterminator („ \;“, ja, das Leerzeichen ist wichtig) als auch die Zieldatei für das „convert“-Kommando.  
            
          
          > Aus dem Grund, da ich die Bilder in Originalgröße noch behalten will).  
            
          Da ich nicht genau weiß, ob und wie man mit find die Namen gefundener Dateien manipulieren kann, ist eine Schleife hier wohl besser geeignet.  
            
          
          > Zur Verständnis: Der im Parameter exec angegebene Code wird auf jede Datei, die find findet, ausgeführt?  
            
          Exakt.  
            
            
          Einen schönen Sonntag noch.  
            
          Gruß, Mathias  
          
          -- 
          ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
            
          debian/rules
          
          1. Hallo nochmal.

            Aus dem Grund, da ich die Bilder in Originalgröße noch behalten will).

            Da ich nicht genau weiß, ob und wie man mit find die Namen gefundener Dateien manipulieren kann, ist eine Schleife hier wohl besser geeignet.

            OK, wenn du die kleineren Dateien in einem übergeordneten Verzeichnis ablegst, gibt es keine Probleme, das ganze doch mit find zu machen.

            Einen schönen Sonntag noch.

            Gruß, Mathias

            --
            ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
            debian/rules
  4. Hallo Adimos,

    hat es denn inzwischen "Klick" gemacht, was ich unten mit "Script" meinte?

    MfG,
    Hartmut R.