Verwenden Sie mogrify, um die Größe großer Dateien zu ändern, während Sie kleine ignorieren
10
Ich führe den folgenden Befehl aus:
mogrify -resize '400x400>' *.png
Beachten Sie das ">". Angeblich werden kleinere Dateien ignoriert, aber obwohl die Größe nicht geändert wird, werden sie bearbeitet (Änderungsdatum und Dateigröße werden geändert).
Gibt es eine Möglichkeit, die kleineren Dateien in Ruhe zu lassen? Ich möchte mehrere tausend unnötige Schreibvorgänge vermeiden.
Ich denke, mogrifydie Datei wird systematisch neu geschrieben, daher besteht Ihre einzige Hoffnung darin, zuerst die Liste zu filtern, wie von jippie vorgeschlagen . So können Sie es machen (ungetestet): Drucken Sie eine Liste von Bilddateien mit einer Größenangabe aus, behalten Sie nur die Namen bei, deren zugehörige Größe innerhalb des Bereichs liegt, und verarbeiten Sie diese Liste.
Drucken Sie für jede Datei eine Zeile mit der Breite, einem Leerzeichen, der Höhe, einem Leerzeichen und dem Dateinamen. Abhängig von Ihrer Version von identifykann das \nHinzufügen einer endgültigen neuen Zeile entweder erforderlich (ImageMagick 6.6.0) oder überflüssig, aber harmlos (GraphicsMagick 1.1.11) sein.
( awk) Wenn in jeder Zeile die Breite ( $1) und Höhe ( $2) den erforderlichen Bedingungen entsprechen, gilt Folgendes:
Entfernen Sie den gesamten Text bis zum zweiten Leerzeichen. Dadurch werden Breite und Höhe entfernt.
Drucken Sie, was von der Zeile übrig bleibt, nämlich den Dateinamen.
Ersetzen Sie Zeilenumbrüche durch Nullzeichen.
Rufen Sie xargs -0auf, um den mogrifyBefehl für die Dateinamen auszuführen . (Wir können plain nicht verwenden, xargsda es keine Eingaben mit Leerzeichen oder verarbeiten kann \'".)
Die Dateinamen können beliebige Zeichen außer Zeilenumbrüchen enthalten.
Kannst du das Skript erklären? Speziell der "Sub" -Teil. Es werden die Dateinamen ohne Leerzeichen gedruckt oder eine neue Zeile eingefügt. mogrify: Datei `22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951 kann nicht geöffnet werden. Ich habe keine Ahnung, woher diese "308 400" kommt. Ich sollte erwähnen, dass die Dateien Leerzeichen in ihren Namen haben. Danke.
Mike
Ich erhalte mogrify: Datei `340 271 22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951 kann nicht geöffnet werden. Ich habe den Befehl mit 200x200 für zwei Beispieldateien ausgeführt. Ich sehe, dass 308x400 die Größe einer der Dateien ist
Mike
2
@ Mike Ah, verstanden. Einige Versionen von identifysetzen nach jedem Datensatz automatisch eine neue Zeile, andere müssen explizit eine haben. Fügen Sie \nam Ende des Arguments hinzu -format(siehe meine Bearbeitung).
Gilles 'SO - hör auf böse zu sein'
8
Ich hatte das gleiche Problem, das Sie beschrieben haben. Hier ist meine Lösung:
#!/bin/bash
files=*.jpg
minimumWidth=640
minimumHeight=640for f in $filesdo
imageWidth=$(identify -format "%w""$f")
imageHeight=$(identify -format "%h""$f")if["$imageWidth"-gt "$minimumWidth"]||["$imageHeight"-gt "$minimumHeight"];then
mogrify -resize ''"$minimumWidth"x"$minimumHeight"'' $ffidone
Ich habe es auf mehreren JPEG-Bildern auf einem virtualisierten CentOS 6.5-Computer getestet. Das Skript hat nur die Größe der Bilder geändert und komprimiert, deren Breite oder Höhe größer als 640 Pixel war. Dadurch funktionierte es für Bilder mit Abmessungen wie 800 x 600 (Querformat, Größenänderung auf 640 x 480) und Abmessungen wie 600 x 800 (Hochformat, Größenänderung auf 480 x 640).
PS: Ein Hinweis zum 400x400Parameter: mogrifyverarbeitet die Datei auch dann, wenn ihre Abmessungen gleich oder kleiner als 400 x 400 sind, ändert jedoch nur die Größe , wenn ihre Abmessungen größer als 400 x 400 sind. Aus diesem Grund werden die Änderungszeit und -größe der Dateien geändert (in meinem Fall wurden mogrifydiese Dateien noch größer als sie waren).
wird ausgegeben, 1wenn das Bild größer als 400x400und 0wenn es gleich oder kleiner als 400x400...
Unter der Annahme vernünftiger Dateinamen (keine Zeilenumbrüche / Leerzeichen / Tabulatoren usw.) können Sie Bildnamen identifydrucken, denen entweder vorangestellt ist, 1:oder 0:die Ausgabe verarbeiten, 0:indem Sie Zeilen löschen, die mit den Zeilen beginnen und die führenden 1:Zeilen entfernen , sodass nur die Dateinamen übrig bleiben pro Zeile, dann leiten Sie diese Liste an mogrify ... @-(die @Syntax wurde hinzugefügt in imagemagick v6.5.2):
Andernfalls findkönnten Sie mit nur die Dateien mit einer Größe> 400x400 drucken und dann das Ergebnis an xargs+ weiterleiten mogrify(es ist weniger effizient, da für jede Datei eine Shell ausgeführt wird, aber es sollte mit allen Arten von Dateinamen funktionieren):
Wie wäre es mit Identifizieren, um die Größe Ihres Bildes zu ermitteln und anhand eines kleinen Skripts zu entscheiden, ob Sie es bearbeiten möchten oder nicht:
Angesichts meiner begrenzten Fähigkeiten und der Tatsache, dass die Bildgrößen so unregelmäßig sind, brauche ich eine einfachere Methode. Ich würde sie lieber alle mit mogrify verarbeiten.
Mike
0
Ich benutze ein solches PHP-Skript, es benutzt ImageMagick:
Hier ist meine Sichtweise, die Ideen von @ArionKrause und @don_crissti enthält:
#!/bin/bash
# adapted from http://unix.stackexchange.com/a/157594/110635
# and http://unix.stackexchange.com/a/220619/110635
W=1024
H=768
SIZE_TEST="%[fx:(h>$H && w>$W)]"'\n'
for f in $*; do
if [ $(identify -format "$SIZE_TEST" "$f") = 1 ]; then
echo "Resize: $f"
mogrify -resize ''"$W"x"$H"'' "$f"
else
echo "Do not resize: $f"
fi
done
(Ich brauchte das, weil mein Lieblings-Batch-Prozessor Phatch mit Ubuntu 16.04 nicht funktioniert.)
identify
setzen nach jedem Datensatz automatisch eine neue Zeile, andere müssen explizit eine haben. Fügen Sie\n
am Ende des Arguments hinzu-format
(siehe meine Bearbeitung).Ich hatte das gleiche Problem, das Sie beschrieben haben. Hier ist meine Lösung:
Ich habe es auf mehreren JPEG-Bildern auf einem virtualisierten CentOS 6.5-Computer getestet. Das Skript hat nur die Größe der Bilder geändert und komprimiert, deren Breite oder Höhe größer als 640 Pixel war. Dadurch funktionierte es für Bilder mit Abmessungen wie 800 x 600 (Querformat, Größenänderung auf 640 x 480) und Abmessungen wie 600 x 800 (Hochformat, Größenänderung auf 480 x 640).
PS: Ein Hinweis zum
400x400
Parameter:mogrify
verarbeitet die Datei auch dann, wenn ihre Abmessungen gleich oder kleiner als 400 x 400 sind, ändert jedoch nur die Größe , wenn ihre Abmessungen größer als 400 x 400 sind. Aus diesem Grund werden die Änderungszeit und -größe der Dateien geändert (in meinem Fall wurdenmogrify
diese Dateien noch größer als sie waren).quelle
Sie können den
fx
Operator auch verwenden , um Bilder basierend auf Höhe / Breite zu filtern, zwird ausgegeben,
1
wenn das Bild größer als400x400
und0
wenn es gleich oder kleiner als400x400
...Unter der Annahme vernünftiger Dateinamen (keine Zeilenumbrüche / Leerzeichen / Tabulatoren usw.) können Sie Bildnamen
identify
drucken, denen entweder vorangestellt ist,1:
oder0:
die Ausgabe verarbeiten,0:
indem Sie Zeilen löschen, die mit den Zeilen beginnen und die führenden1:
Zeilen entfernen , sodass nur die Dateinamen übrig bleiben pro Zeile, dann leiten Sie diese Liste anmogrify ... @-
(die@
Syntax wurde hinzugefügt inimagemagick v6.5.2
):Andernfalls
find
könnten Sie mit nur die Dateien mit einer Größe> 400x400 drucken und dann das Ergebnis anxargs
+ weiterleitenmogrify
(es ist weniger effizient, da für jede Datei eine Shell ausgeführt wird, aber es sollte mit allen Arten von Dateinamen funktionieren):Wenn Sie ein
zsh
Benutzer sind, sehen Sie auch diese Antwort .quelle
Wie wäre es mit Identifizieren, um die Größe Ihres Bildes zu ermitteln und anhand eines kleinen Skripts zu entscheiden, ob Sie es bearbeiten möchten oder nicht:
Es sollte nicht zu schwierig sein, das Ausgabeformat für die Verwendung in einem einfachen Skript zu bearbeiten.
quelle
Ich benutze ein solches PHP-Skript, es benutzt ImageMagick:
Es skaliert alle Bilder im aktuellen Verzeichnis, die an einer Kante größer als 3000 sind.
Befehl
php scale.php
ausführen : ODERphp scale.php 2000
quelle
Hier ist meine Sichtweise, die Ideen von @ArionKrause und @don_crissti enthält:
(Ich brauchte das, weil mein Lieblings-Batch-Prozessor Phatch mit Ubuntu 16.04 nicht funktioniert.)
quelle
Meine Funktionen zu ändern und zu optimieren
quelle