छोटे की अनदेखी करते हुए बड़ी फ़ाइलों का आकार बदलने के लिए मोगरीफाई का उपयोग करें


10

मैं निम्नलिखित कमांड चला रहा हूं:

mogrify -resize '400x400>' *.png

">" पर ध्यान दें। माना जाता है कि यह छोटी फाइलों को नजरअंदाज कर देगा, लेकिन यद्यपि यह उन्हें आकार नहीं देता है, यह उन्हें संपादित करता है (संशोधन की तारीख और फ़ाइल का आकार बदल जाता है)।

क्या यह वास्तव में सिर्फ छोटी फ़ाइलों को अकेला छोड़ने का एक तरीका है? मैं कई हजार अनावश्यक लेखन कार्यों से बचना चाहूंगा।

जवाबों:


15

मुझे लगता है कि mogrifyफ़ाइल को व्यवस्थित रूप से फिर से लिखा गया है, इसलिए आपकी एकमात्र आशा सूची को पहले फ़िल्टर करना है, जैसा कि जिप्पी द्वारा सुझाया गया है । यहां बताया गया है कि आप ऐसा कैसे कर सकते हैं (अप्रकाशित): एक आकार संकेत के साथ छवि फ़ाइलों की एक सूची का प्रिंट आउट करें, केवल उन नामों को रखें जिनका संबंधित आकार सीमा के भीतर है, और उस सूची को संसाधित करें।

identify -format '%w %h %i\n' ./*.png |
awk '$1 > 400 || $2 > 400 {sub(/^[^ ]* [^ ]* /, ""); print}' |
tr '\n' '\0' |
xargs -0 mogrify -resize '400x400'

स्क्रिप्ट स्पष्टीकरण:

  • प्रत्येक फ़ाइल के लिए, चौड़ाई, एक स्थान, ऊँचाई, एक स्थान और फ़ाइल नाम के साथ एक पंक्ति प्रिंट करें। आपके संस्करण के आधार पर identify, \nअंतिम नई पंक्ति जोड़ने के लिए या तो आवश्यक हो सकता है (ImageMagick 6.6.0) या सतही लेकिन हानिरहित (GraphicsMagick 1.1.11)।
  • ( awk) प्रत्येक पंक्ति पर, यदि चौड़ाई ( $1) और ऊंचाई ( $2) आवश्यक स्थितियों से मेल खाती है, तो:
    • दूसरे स्थान वर्ण तक सभी पाठ निकालें। यह चौड़ाई और ऊंचाई को स्ट्रिप्स करता है।
    • लाइन का जो शेष है, जो फ़ाइल नाम है, उसे प्रिंट करें।
  • अशक्त पात्रों द्वारा नई कहानियों को बदलें।
  • फ़ाइल नामों पर कमांड xargs -0निष्पादित करने के लिए कॉल करें mogrify। (हम सादे का उपयोग नहीं कर सकते xargsक्योंकि यह व्हॉट्सएप वाले इनपुट से निपट नहीं सकता है या \'")

फ़ाइल नामों में नई वर्णमाला को छोड़कर कोई भी वर्ण हो सकता है।


क्या आप उस स्क्रिप्ट की व्याख्या कर सकते हैं? विशेष रूप से "उप" भाग। यह एक स्थान के बिना फ़ाइल नामों को प्रिंट कर रहा है या एक नई लाइन सम्मिलित कर रहा है। mogrify: फ़ाइल खोलने में असमर्थ `22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951। मुझे नहीं पता कि "308 400" कहां से आता है। मुझे उन फाइलों का उल्लेख करना चाहिए जिनके नाम में स्थान है धन्यवाद।
माइक

मैं mogrify कर रहा हूं: फ़ाइल खोलने में असमर्थ `340 271 22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951। मैंने दो नमूना फ़ाइलों पर 200x200 का उपयोग करके कमांड को चलाया। मैं देख रहा हूं कि 308x400 फाइलों में से एक का आकार है
माइक

2
@ मायके आह, मिल गया। identifyप्रत्येक संस्करण के बाद कुछ संस्करणों को स्वचालित रूप से एक नई पंक्ति में रखा जाता है, दूसरों को स्पष्ट रूप से एक होने की आवश्यकता होती है। \nतर्क के अंत में जोड़ें -format(मेरा संपादन देखें)।
गिल्स एसओ- बुराई को रोकना '19

8

मैंने उसी समस्या का सामना किया जिसका आपने वर्णन किया है। यहाँ मेरा समाधान है:

#!/bin/bash
files=*.jpg
minimumWidth=640
minimumHeight=640

for f in $files
do
    imageWidth=$(identify -format "%w" "$f")
    imageHeight=$(identify -format "%h" "$f")

    if [ "$imageWidth" -gt "$minimumWidth" ] || [ "$imageHeight" -gt "$minimumHeight" ]; then
        mogrify -resize ''"$minimumWidth"x"$minimumHeight"'' $f
    fi
done

मैंने एक वर्चुअलाइज्ड सेंटोस 6.5 मशीन पर कई जेपीईजी छवियों पर इसका परीक्षण किया। स्क्रिप्ट केवल आकार और उन छवियों को संकुचित करती है जिनकी चौड़ाई या ऊंचाई 640 पिक्सेल से बड़ी थी। इसने 800 x 600 (परिदृश्य, इसे 640 x 480 के आकार का) और 600 x 800 (चित्र, जैसे आकार 480 x 640 तक आकार) जैसे आयामों के साथ काम किया।

पुनश्च: 400x400पैरामीटर पर एक नोट : mogrifyफ़ाइल को संसाधित करेगा भले ही इसके आयाम समान हों या 400x400 से छोटे हों, लेकिन इसका आकार केवल तभी होगा जब इसके आयाम 400x400 से बड़े हों। इसीलिए फ़ाइलों का संशोधन समय और आकार बदला जाता है (मेरे मामले में, mogrifyइन फ़ाइलों को उनकी तुलना में भी बड़ा बनाया गया है)।


5

आप भी fxऊंचाई / चौड़ाई के आधार पर छवियों को फ़िल्टर करने के लिए ऑपरेटर का उपयोग कर सकते हैं उदा

identify -format '%[fx:(h>400 && w>400)]\n' image.png

1अगर छवि से बड़ा है 400x400और 0अगर यह बराबर है या इससे छोटा है तो आउटपुट होगा 400x400...


मान लें कि फ़ाइल नाम (कोई नया लिंक / स्पेस / टैब आदि नहीं) आप या identifyतो पहले से मौजूद छवि नामों को प्रिंट करने के लिए उपयोग कर सकते हैं 1:या 0:आउटपुट लाइनों को हटाने की प्रक्रिया शुरू 0:कर सकते हैं, 1:जो बाकी लाइनों पर अग्रणी को हटाने और हटाने की प्रक्रिया करते हैं, इसलिए केवल फ़ाइल नाम ही रहते हैं, एक प्रति पंक्ति, फिर उस सूची पर mogrify ... @-( @सिंटैक्स को जोड़ा गया था imagemagick v6.5.2) को पाइप करें :

identify -format '%[fx:(h>400 && w>400)]:%i\n' ./*.png | \
sed '/^1:/!d;//s///' | mogrify -resize '400x400' -- @-

अन्यथा, findआप केवल फ़ाइलों को आकार> 400x400 के साथ मुद्रित कर सकते हैं और फिर परिणाम को xargs+ पर पाइप कर सकते हैं mogrify(यह कम कुशल है क्योंकि यह प्रत्येक फ़ाइल के लिए एक शेल चलाता है लेकिन इसे सभी प्रकार के फ़ाइल नामों के साथ काम करना चाहिए):

find . -maxdepth 1 -type f -name '*.png' -exec sh -c \
'identify -format "%[fx:(h>400 && w>400)]\n" "$0" | grep -q 1' {} \; -print0 \
| xargs -0 mogrify -resize '400x400'

यदि आप एक zshउपयोगकर्ता हैं तो यह उत्तर भी देखें ।


3

अपनी छवि का आकार खोजने के लिए पहचान का उपयोग करने के बारे में और एक छोटी स्क्रिप्ट से तय करें कि क्या आप इसे संपादित करना चाहते हैं या नहीं:

identify -format "width=%w heigth=%h" bootchart.png 
width=3853 heigth=10092

एक सरल स्क्रिप्ट में उपयोग के लिए आउटपुट स्वरूप को संपादित करने के लिए बहुत कठिन नहीं होना चाहिए।


मेरे सीमित कौशल और इस तथ्य को ध्यान में रखते हुए कि छवियों का आकार बहुत अनियमित है, मुझे एक सरल विधि की आवश्यकता है। मैं बल्कि उन सभी को मोगरिफाई के साथ संसाधित करता हूं।
माइक

0

मैं ऐसी PHP-script का उपयोग करता हूं, यह ImageMagick का उपयोग करता है:

<?php
$dir = ".";
$exts = array('jpg', 'jpeg', 'png', 'gif');
$max_size = is_numeric($argv[1]) ? $argv[1] : 3000;
$morgify = "mogrify -verbose -scale \"${max_size}x${max_size}>\" -quality 85";
$identify = "identify -format \"%wx%h\"";

$dh = opendir($dir);
while (($file = readdir($dh)) !== false) {
    $path = "$dir/$file";
    // skip no images
    $dot = strrpos($file, '.');
    $ext = strtolower(substr($file, $dot + 1));
    if (!in_array($ext, $exts)) continue;
    // large size?
    $size = exec("$identify \"$path\"");
    list($width, $height) = explode('x', trim($size));
    if (max($width, $height) > $max_size) {
        // scale!
        print "scale $file ${width}x${height}";
        exec("$morgify \"$path\"");
        print "\n";
    }
}
closedir($dh);
?>

यह वर्तमान निर्देशिका में सभी छवियों को किसी न किसी किनारे पर 3000 से अधिक बड़ा करता है।

रन कमांड: php scale.phpयाphp scale.php 2000


0

यहाँ मेरा इस पर विचार है, @ArionKrause और @don_crissti से विचारों को शामिल करना:

#!/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

(मुझे इसकी आवश्यकता थी क्योंकि मेरा पसंदीदा बैच प्रोसेसर Phatch Ubuntu 16.04 के साथ काम नहीं करता है।)


0

मेरे कार्यों का आकार बदलने और अनुकूलन करने के लिए

resize_and_optimize_images () {
  resize_images 700 $PWD
  optimize_images 85 $PWD
}

resize_images () {
  max="$1"
  dir="$2"

  echo "Resizing dir $dir, max size - $max"

  shopt -s globstar

  for f in $dir/**/*.jpg $dir/**/*.jpeg $dir/**/*.png ; do
    echo "Checking $f"
    s=`identify -format "%w" $f`

    if [ $s -gt $max ]; then
      echo "Resizing..."
      mogrify -verbose -resize $max $f
    fi
    echo
  done

  echo "Done resizing dir $dir"
}

optimize_images () {
  quality="$1"
  dir="$2"

  echo "Optimizing dir $dir, quality - $quality"

  docker run -it --rm --name optimize_images_foo \
    -v $dir:/usr/src/app \
    -w /usr/src/app ruby:2.4-stretch bash -c \
    "gem install image_optim image_optim_pack && \
    (curl -L \"http://static.jonof.id.au/dl/kenutils/pngout-20150319-linux.tar.gz\" | tar -xz -C /usr/bin --strip-components 2 --wildcards \"*/x86_64/pngout\") && \
    image_optim --verbose --allow-lossy --jpegoptim-allow-lossy true --jpegoptim-max-quality $quality --pngquant-allow-lossy true --pngquant-quality 0..$quality -r ."

  echo "Done optimizing dir $dir"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.