ছোট ফাইলগুলিকে উপেক্ষা করার সময় বড় ফাইলগুলির আকার পরিবর্তন করতে মোগ্রিফাই ব্যবহার করুন


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একটি চূড়ান্ত নিউলাইন যুক্ত করা হয় হয় (ইমেজম্যাগিক .6..6.০) বা অতিরিক্ত অতিরিক্ত কিন্তু ক্ষতিহীন হতে পারে (গ্রাফিক্সম্যাগিক ১.১.১১)।
  • ( awk) প্রতিটি লাইনে, প্রস্থ ( $1) এবং উচ্চতা ( $2) যদি প্রয়োজনীয় শর্তাবলীর সাথে মেলে তবে:
    • দ্বিতীয় পাঠ্য অক্ষর পর্যন্ত সমস্ত পাঠ্য সরান। এটি প্রস্থ এবং উচ্চতা রেখাচিত্রমালা।
    • লাইনের কী থেকে যায় তা ফাইলের নাম মুদ্রণ করুন।
  • শূন্য অক্ষর দ্বারা নতুন লাইন প্রতিস্থাপন।
  • ফাইলের নামগুলিতে আদেশটি xargs -0কার্যকর করতে কল করুন mogrify। (আমরা সরল ব্যবহার করতে পারি না xargsকারণ এটি শ্বেত স্পেসযুক্ত ইনপুটটির সাথে ডিল করতে পারে না \'"))

ফাইলের নামগুলিতে নিউলাইনগুলি ব্যতীত অন্য কোনও অক্ষর থাকতে পারে।


আপনি কি এই স্ক্রিপ্ট ব্যাখ্যা করতে পারেন? বিশেষত "সাব" অংশ। এটি কোনও স্থান ছাড়াই ফাইলের নামগুলি মুদ্রণ করছে বা একটি নতুন লাইন সন্নিবেশ করছে। মোগরিফি: ফাইল খুলতে অক্ষম `22 553.png308 400 0134 2.png '@ ত্রুটি / png.c / ReadPNGI छवि / 2951। "308 400" কোথা থেকে এসেছে তা আমার কোনও ধারণা নেই। ফাইলগুলির নাম ফাঁকা আছে উল্লেখ করা উচিত আপনাকে ধন্যবাদ।
মাইক

আমি মোগরিফাই পাচ্ছি: ফাইল খুলতে অক্ষম `340 271 22 553.png308 400 0134 2.png '@ ত্রুটি / পিএনজি.সি / রিডপিএনজিআইজেজ / 2951। আমি দুটি স্যাম্পল ফাইলগুলিতে 200x200 ব্যবহার করে কমান্ডটি চালিয়েছি। আমি দেখতে পাচ্ছি যে 308x400 ফাইলগুলির মধ্যে একটির আকার
মাইকে

2
@ মাইক আহ, বুঝেছি identifyপ্রতিটি রেকর্ডের পরে কিছু সংস্করণ স্বয়ংক্রিয়ভাবে একটি নতুন লাইন রাখে, অন্যের স্পষ্টভাবে একটি থাকা দরকার। \nযুক্তির শেষে যুক্ত করুন -format(আমার সম্পাদনা দেখুন)।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

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) আকারের চিত্র সহ কাজ করেছে made

PS: 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
$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

@ অরিয়নক্রাউজ এবং @ ডন_ক্রিসটি থেকে ধারণাগুলি একত্রিত করে আমি এটি গ্রহণ করি:

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

(আমার এটি প্রয়োজন কারণ আমার প্রিয় ব্যাচের প্রসেসর ফ্যাচ উবুন্টু 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"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.