চিত্র অনুপাত অনুসারে বাছাই করুন


13

আমি কয়েকটি নতুন ফ্রেমের সাথে মানিয়ে নিতে কয়েকটি শিল্প চিত্র নির্বাচন করার চেষ্টা করছি। আমি এই চিত্রগুলিকে একটি নির্দিষ্ট দিক অনুপাতের নৈকট্য অনুসারে বাছাই করতে সক্ষম হতে চাই এবং তারপরে ফিহ জাতীয় কিছু মাধ্যমে নৈকট্য ক্রম হ্রাসে দেখতে পাচ্ছি।

কিছু গৌরবময় এক-লাইন ইউনিক্স প্রকাশ আছে? অন্যথায় পাইথনের কয়েক ডজন লাইনের এটি পরিষ্কার করা উচিত।


3
আপনি চিত্রম্যাগিকের মাধ্যমে দিক অনুপাতটি টানতে পারেন, যেমন identify -format "%[fx:w/h]:%M\n" *.jpg। আমি কীভাবে সহজেই একটি স্বেচ্ছাসেবী মানের নিকটবর্তী অনুসারে বাছাই করতে চাই না। sortএই ধরণের বাছাই সমর্থন বলে মনে হচ্ছে না।
এনএন

ঠিক আছে, মূলত, আপনি এই সংখ্যাগুলি একটি পূর্ণসংখ্যার দূরত্বের মেট্রিককে রূপান্তর করতে চান এবং তারপরে আপনি এটিকে বাছাই করতে পারেন -n। মনে হচ্ছে আপনি ইমেজম্যাগিকের সাহায্যে সমস্ত গণিত করতে পারবেন।
ডারোবার্ট

উত্তর:


8

নেতৃত্ব হিসাবে এনএন এর ইমেজম্যাগিক মন্তব্য ব্যবহার করে, দেখা যাচ্ছে যে আপনি এটির -formatআউটপুট অংশ হিসাবে নির্বিচারে গণনা করতে পারেন । সুতরাং, একটি সম্ভাব্য উপায়:

identify -format "%[fx:round(100000*abs((4/3)-(w/h)))]:%M\n" *.jpg | \
    sort -n -k1 -t:

আপনি যা চান তা করা উচিত মনে রাখবেন যে 4/3 এর মধ্যে স্থির, পছন্দসই দিক অনুপাত রয়েছে। আপনি অবশ্যই এটি পূর্ববর্তী হিসাবে আউটপুট হিসাবে খুঁজে পেতে পারেন identify("এই চিত্রের নিকটতম" মেলে)।

ব্যাখ্যা করার জন্য, আমরা কাঙ্ক্ষিত এবং আসল দিক রেশনের মধ্যে সাধারণ পার্থক্য নিচ্ছি। তারপরে একটি বিশাল সংখ্যার দ্বারা গুণমান এবং গোলাকার। গুণমান এবং বৃত্তাকার কারণ সাজান শুধুমাত্র সংখ্যাকে পরিচালনা করে, যুক্তি দিয়ে নয়।

সম্পাদন করা

দেখা যাচ্ছে sortযে কেবল পূর্ণসংখ্যা নয়, যুক্তি দেখায়। এটি এমনকি একক ইউনিক্স স্পেসিফিকেশন (v4) এ নির্দিষ্ট করা হয়েছে। সুতরাং, আপনি যে কাজটি থেকে মুক্তি পেতে পারেন:

identify -format "%[fx:abs((4/3)-(w/h))]:%M\n" *.jpg | \
    sort -n -k1 -t:

সনাক্তকরণের ফর্ম্যাট বিকল্পটিতে আপনি কোথায় ডকুমেন্টেশন খুঁজে পেয়েছেন? আমি ম্যান পৃষ্ঠায় কিছুই দেখতে পেলাম না এবং ভয়ঙ্কর জিনিসটি বের করার চেষ্টা করে বেশ কিছুটা সময় ব্যয় করলাম :)।
টেরডন

ওহ, এবং আমার সিস্টেমে আপনার আদেশটি কাজ করছে বলে মনে হচ্ছে না। আমি পেতে 33333:cover.jpgযেখানে cover.jpg 500x500 হয়।
টেরডন

2
@terdon ভাল, কারণ এটির অনুপাতটি 1/1 নয় 4/3। 4 / 3-1 = 1/3 = .333…। আপনার যে অনুপাতটি চান তার চেয়ে 4/3 টি পরিবর্তন করুন (এটির 1/1 এর মতো লাগে)। দস্তাবেজগুলি একটি বিভ্রান্তিকর উপায়ে ইমেজমেজিক.আর.সি / স্ক্রিপ্ট / এফএক্স.এফপি এ থাকে। তাদেরও খুঁজে পেতে আমাকে কিছুক্ষণ সময় নিয়েছে।
ডার্বোবার্ট

লিঙ্কের জন্য ধন্যবাদ। বাকী হিসাবে, আমি একটি বোকা ছিল। আমার পরীক্ষার ফোল্ডারে আমার কেবল একটি জেপিজি ছিল (বাকী অংশগুলি পিএনজি) সুতরাং যেহেতু আমি কেবলমাত্র একটি আউটপুট লাইন দেখেছি ধরে নিয়েছি যে এটি পছন্দসই ফলাফল এবং এটি সনাক্ত করে যে চিত্রটি দাবি করেছিল যে চিত্রটি 4/3 আকৃতির অনুপাত রয়েছে had একটি মার্জিত সমাধানের জন্য আমি সোমবার সন্ধ্যায় ... +1 ভাবার চেষ্টা করার জন্য এটি পেয়েছি।
টেরডন

চমৎকার উত্তর! কাঙ্ক্ষিত অনুপাত মেনে চলা সমস্ত চিত্রের ফাইলের নামগুলিতে কোনও ধরণের লেবেল যুক্ত করার কোনও উপায় আছে কি?
মানসিকবিদ

3

ভাল, এর সবচেয়ে সহজ উপায় হ'ল ইমেজম্যাগিক ব্যবহার করা । এটি আপনার লিনাক্স বিতরণের সংগ্রহস্থলগুলিতে হওয়া উচিত, ডেবিয়ান ভিত্তিক সিস্টেমগুলির জন্য, রান করুন:

sudo apt-get install imagemagick

ইমেজম্যাগিক স্যুটের একটি প্রোগ্রাম হ'ল identifyএটি ইনপুট ইমেজ ফাইলগুলির তালিকার বৈশিষ্ট্যগুলি মুদ্রণ করবে। এটির সাথে সম্মিলন sortআপনাকে আকার অনুসারে বাছাই করা চিত্রগুলির একটি তালিকা দেবে (আপনি যে কোনও এক্সটেনশন (গুলি) এর জন্য পিএনজি পরিবর্তন করতে পারেন:

identify *png | sort -gk 3

আপনার যদি আকৃতির অনুপাতের দরকার হয় এবং কেবল আকার না হয় তবে এর মতো কিছু চেষ্টা করুন:

  1. সহজ বিকল্প, ধরে নিন আপনার চিত্রের নামের কোনও স্থান নেই :

    identify *png *jpg *gif | \
    gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' | \
    sed 's/\[.\]//' | sort -gk 3
    

    গাক কমান্ড তৃতীয় ক্ষেত্রটি (চিত্রের আকার যা LxH ফর্ম্যাট রয়েছে) অ্যারে "মাপগুলিতে" বিভক্ত করে এবং তারপরে 1 ম ক্ষেত্রটি (চিত্রের নাম) এবং চিত্রটির দৈর্ঘ্যটিকে তার উচ্চতা দ্বারা বিভক্ত করার ফলাফল প্রিন্ট করে। sedকমান্ড মাত্র আউটপুট শোভাকর হয় এবং sortকমান্ড ছবির আকার অনুপাত অনুযায়ী ফলাফলের বাছাই করে।

  2. আরও জটিল, এই ফাইলটির নামের সাথে ফাঁকা স্থানগুলি মোকাবেলা করতে পারে:

    find . \( -iname  "*png" -o -iname "*jpg" -o -iname "*gif" \) -exec identify {} \; |\
    perl -ne '/(.+?)\s+[A-Z]{3}\s+(\d+)x(\d+)/; print "$1 ", $2/$3, "\n"' | \
    sort -gk 2
    

    এখানে আমরা findযে ফাইলগুলিতে আগ্রহী সেগুলি সনাক্ত করতে এবং identifyকমান্ডটি চালাতে ব্যবহার করছি এবং তারপরে কিছুটা পার্ল স্ক্রিপ্টের মাধ্যমে এর আউটপুটটি পাইপ করব। নিয়মিত প্রকাশটি তিনটি মূল অক্ষর ( [A-Z]{3}) এর সন্ধান করে যা চিত্র ফর্ম্যাট হওয়া উচিত। একবার আমরা এটি খুঁজে পেয়েছি, ইমেজের নাম এবং মাত্রা সনাক্ত করা সহজ।

    আমি এখানে গাওক ব্যবহার করছি না কারণ ইনপুট ফাইলের নামের ফাঁকে উপস্থিতি ক্ষেত্রের সংখ্যা গুলিয়ে ফেলবে। পরিশেষে, স্ক্রিপ্টটি চিত্রটির নাম এবং দৈর্ঘ্য / উচ্চতা বিভাগের ফলাফলটি মুদ্রণ করবে যা আমরা sortসংখ্যায় করি।

যদি উপলভ্য অনুপাতের অনুপাতটি কেবল ব্রাউজ করাই যথেষ্ট না হয়, যদি আপনার পছন্দসই অনুপাতের অনুপাত সহ কমপক্ষে একটি চিত্র থাকে তবে কেবল সেই চিত্রগুলি বের করার জন্য গ্রেপ ব্যবহার করুন যার অনুপাতটি নিকটতম:

identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' |\
sed 's/\[.\]//' | sort -gk 3 | grep -C 10 GOOD_IMAGE.jpg

2

আপনি প্রতিটি দিক অনুপাতের পার্থক্যটি রেফারেন্সের সাথে গণনা করতে পারেন। ডার্বার্টের উত্তরের মতো মনে হচ্ছে তবে সহজ:

ref=4/3
identify -format "%[fx:abs(w/h - $ref)] %M\n" *.jpg | sort -n -k1

হুঁ, দৃশ্যত বাছাইয়ের যুক্তি না। আমি যে ইমপ্রেশনটি তা করি নি তার মধ্যে ছিল ...
ডার্বোবার্ট

2

একটি অনুপাতের অনুপাত কেবল একটি সংখ্যার, তাই যদি নামটি অনুপাত-অনুপাতের সাথে উপসর্গ করা হয় তবে আপনি তাদের নামগুলি অনুসারে চিত্রগুলি ব্রাউজ করতে পারেন। প্রি-অনুপাতের অনুপাতের সাথে প্রতীকী লিঙ্কগুলি তৈরি করা আপনাকে অনুপাত-অনুপাত অনুসারে বাছাই করা চিত্রগুলি ব্রাউজ করতে দেয়।

নিম্নলিখিত দর্শকরা প্রত্যাশা অনুযায়ী কাজ করেন। ( ফেহ ফরোয়ার্ড / পিছনে দেয় না, এমনকি বাস্তব চিত্রগুলির জন্য - আমার সিস্টেমে)

  • comix
  • ইগো (জিনোম / চিত্র দর্শকের চোখ)
  • gwenview

picd='/media/dat_ext4/pictures/jpg/misc'
srtd="$picd/ar-sort"   # directory to hold "sorted" symbolic links
mkdir -p "$srtd"              

find "$picd" -maxdepth 1 -type f -name "*" -print0 | 
  while IFS= read -d $'\0' -r file ; do
    [[ $(file -ib "$file") != image* ]] && continue  # skip non-image files
    ar="$(identify -format "%[fx:w/h]" "$file")"  
    slink="$(printf '%s/%06.4f %s' "$srtd" "$ar" "$(basename "$file")")"
    # make symbolic link in 'ar-sort' directory
    ln -s "$file" "$slink"  
    echo "$slink" 
  done 

ar-sortডিরেক্টরিতে যান এবং আপনার আগ্রহী যে কোনও প্রারম্ভিক বিন্দু (দিক-অনুপাত) থেকে ব্রাউজ করুন।

প্রতীকী-লিঙ্কের নামগুলি দেখতে দেখতে:

0.6732 Gold Bars.jpg
0.7242 Light Bulb.jpg
0.8022 Escher - Waterfall.jpg
1.3696 Old Typewriter.jpg
1.6000 King Tut.jpg

দ্রষ্টব্য: আপনার স্থানীয় সেটিংস যদি বিন্দুর চেয়ে অন্য দশমিক চিহ্ন ব্যবহার করে তবে এটি কাজ করবে না। সহজ ফিক্স যদিও: stackoverflow.com/questions/12845997/...
Jobjörn Folkesson

1

আমার স্বাভাবিক যুক্তির লাইনটি যেখানেই আমি "ডিগ্রি অফ ডিগ্রি" শব্দ শুনতে পাই সেখানে স্কোয়ার ত্রুটি দূরত্বের মেট্রিক ব্যবহার করা। কেউ অবশ্যই নিখুঁত মান ব্যবহার করতে পারে এবং এটি আরও দ্রুত হবে। স্ক্রিপ্টটি আর্গুমেন্ট হিসাবে আদর্শ দিক অনুপাত হিসাবে নেয় , বর্তমান ডিরেক্টরিতে সমস্ত * .jpg ফাইল প্রসেস করে এবং আদর্শ অনুপাত থেকে বিস্তারের ক্রমবর্ধমান ক্রমে সাজানো আউটপুট দেয়।

head ইমেজম্যাগিকের দ্বারা সন্নিবেশ করা শেষের পংক্তির অক্ষর সরিয়ে দেয়।

স্ক্রিপ্টটিতে একটি গাওয়াক কমান্ড রয়েছে যা আউটপুট ফিল্ড বিভাজকটিকে একটি সম্ভাব্য চরিত্রের জন্য সেট করে, স্কোয়ারড পার্থক্য গণনা করে এবং জোড়া পার্থক্য | ফাইলের নাম মুদ্রণ করে। বাছাই করা হয় এবং অপ্রয়োজনীয় তথ্য (স্কোয়ার্ড অ্যাস্পেক্ট রেশিও পার্থক্য) দ্বারা শেষ হয় cut

#!/bin/sh
if [ x"$1" = "x" ] ; then
  echo "Usage: $0 TargetAspectRatio" >&2
  exit 2
fi
ASPECT_CMD="BEGIN{OFS=\"|\";}\
{\
print (\$1-$1)^2, \$2;\
}"
identify -format "%[fx:w/h]:%M\n" *.jpg | head -n-1 | gawk -F":" "$ASPECT_CMD" | sort -k1 -t"|" | cut -f2 -d"|"

দয়া করে মনে রাখবেন যে এটি চৌকস দূরত্ব এবং গণক / অ্যাডাব্লু এর মধ্যে গণনাগুলি ব্যবহার করে :) (প্রাথমিক শর্টকাটের জন্য @ এনএনকে ধন্যবাদ)
হরিণ হান্টার

আপনি দয়া করে আপনার উত্তরে স্ক্রিপ্টের ব্যাখ্যা যুক্ত করতে পারেন? এটি আরও ভাল করে তুলবে।
এনএন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.