অ্যানিমেটেড জিআইএফ থেকে কীভাবে প্রতিটি দ্বিতীয় ফ্রেম সরিয়ে ফেলবেন?


22

আমার কাছে এমন একটি ফোল্ডার রয়েছে যাতে আমি একটি অ্যানিমেটেড জিআইএফএসে রূপান্তর করতে চাই videos ffmpeg / avconv সরাসরি এটি করার একটি খারাপ কাজ করে, তাই আমি পরিবর্তে প্রথমে প্রতিটি ফ্রেমকে পিএনজি হিসাবে আউটপুট করে এবং তারপরে চিত্রম্যাগিক ব্যবহার করে জিআইএফ-এ রূপান্তর করে ভিডিওটি জিআইএফ-এ রূপান্তর করি convert সমস্যাটি হ'ল ফাইল আকারের ক্ষেত্রে এটি বৃহত জিআইএফ-এর ফলাফল দেয়। এটি সমাধান করতে আমি জিআইএফ থেকে প্রতি দ্বিতীয় বা নবম ফ্রেমটি "ড্রপ" করতে চাই, জিআইএফ-তে রূপান্তরিত করার সময় প্রতিটি চিত্র ফাইল এড়িয়ে বা একটি জিআইএফ থেকে ফ্রেমগুলি সরিয়ে দিয়ে। ইমেজম্যাগিক বা অন্য কোনও কমান্ড-লাইন ইউটিলিটি ব্যবহার করে আমি উবুন্টুতে (13.04) কীভাবে এটি করতে পারি?

উত্তর:


14

ব্যাশ স্ক্রিপ্ট ব্যবহার করা

কমান্ড লাইন থেকে এটি করতে, আপনি জিফসিকাল নামে একটি ইউটিলিটি ব্যবহার করতে পারেন । প্রতিটি অন্যান্য ফ্রেম মোছার জন্য কোনও পদ্ধতিতে অন্তর্নির্মিত নেই, তাই আপনাকে কিছু স্ক্রিপ্টিং দিয়ে আপনার হাতগুলি নোংরা করতে হবে।

আমি একটি মাত্র জিআইএফ করতে এখানে তৈরি একটি দ্রুত স্ক্রিপ্ট:

#!/bin/bash
# This script will take an animated GIF and delete every other frame
# Accepts two parameters: input file and output file
# Usage: ./<scriptfilename> input.gif output.gif

# Make a copy of the file
cp $1 $2

# Get the number of frames
numframes=`gifsicle $1 -I | grep -P "\d+ images" --only-matching | grep -P "\d+" --only-matching`

# Deletion
let i=0
while [[ $i -lt $numframes  ]]; do
    rem=$(( $i % 2 ))

    if [ $rem -eq 0 ]
    then
        gifsicle $2 --delete "#"$(($i/2)) -o $2 
    fi

    let i=i+1 
done

আমি এটি একটি সাধারণ কাউন্টডাউন জিআইএফ দিয়ে পরীক্ষা করেছি:

এখানে চিত্র বর্ণনা লিখুন

এবং স্ক্রিপ্ট মাধ্যমে এটি চালানোর পরে ফলাফল এখানে:

এখানে চিত্র বর্ণনা লিখুন

এই স্ক্রিপ্টটি অবশ্যই বুলেটপ্রুফ নয়, তবে এটি আপনাকে সঠিক দিকে নিয়ে যাবে।


নোট করুন যে আপনার মোছার লুপটি কেবল সরল করা যেতে পারেlet i=0; while [[ $i -lt $(($numframes / 2)) ]]; do gifsicle $2 --delete "#$i" -o $2; let i=i+1; done
ইলমারি করোনেন

1
আসলে, আপনার কোনও লুপের দরকার নেই: gifsicle "$1" --unoptimize $(seq -f "#%g" 0 2 $numframes) -O2 -o "$2"এটি একটি কলে করা হবে।
ইলমারি করোনেন

কমান্ড লাইন থেকে এই স্ক্রিপ্টটি কীভাবে চালাতে হয় আমি আসলে জানি না। আমি এটিকে gifroid.sh ফাইল হিসাবে সংরক্ষণ করার চেষ্টা করেছি এবং এটি ব্যবহারের নির্দেশ অনুসারে এটি চালানোর চেষ্টা করেছি (./gifdrop.sh in.gif out.gif) ইনিফ নামে একটি জিআইএফ এবং এটি অজানা কমান্ড জিফড্রপ
মায়াভার্স

@ মিডিয়াবার্স আপনি কি ফাইলটি কার্যকর করতে পেরেছেন? chmod +x gifdrop.sh
জনবি

1
ম্যাকোএসে আরও ভাল কাজ করে: github.com/colindean/hejmo/blob/master/scriptts/… - আমার সংস্করণটি গ্রেপের পরিবর্তে পার্ল ব্যবহার করে যাতে এটি ম্যাকোজে কাজ করে যাতে ডিফল্টরূপে GNU গ্রেপ ইনস্টল থাকে না। এছাড়াও ফাইলের নামগুলিতে স্পেস পরিচালনা করে।
কলিন ডিন

27

এখানে ব্যবহার করে একটি সহজ কোনো সলিউশন খোঁজেন এর gifsicle JohnB এর স্ক্রিপ্ট চেয়ে:

gifsicle -U input.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif

এই কমান্ডটি বেশিরভাগ ইউনিক্স শেলগুলিতে কাজ করা উচিত; আমি এটি পরীক্ষা করেছি প্রতিস্থাপন input.gifএবং output.gifইনপুট এবং আউটপুট ফাইলের নাম, এবং 99আপনার অ্যানিমেশন ফ্রেমের সংখ্যা সঙ্গে। (এটি একটি বৃহত সংখ্যা ব্যবহার করা ঠিক আছে, তবে গিফসিকল এটি সম্পর্কে অভিযোগ করবে))

কিছু নোট:

  • -Uসুইচ পূর্ববর্তী বেশী ইনপুট অ্যানিমেশন ফ্রেম একত্র করে দেবে, তাই প্রতিটি ফ্রেম একা ঘোরা এবং কোন অন্যদের মধ্যে নির্ভর করে না। অ্যানিমেশন সহ বেশ কিছু করার আগে আপনি সত্যিই এটি করতে চান, অন্যথায় আপনি অগোছালো ফলাফল পেতে পারেন। (যদি আপনার ইনপুট অ্যানিমেশনটি ইতিমধ্যে অপ্রতিরোধ্য হয়, জিফসিকাল এটি সম্পর্কে একটি সতর্কতা মুদ্রণ করতে পারে তবে এটি সম্পূর্ণ নিরীহ is

  • বিপরীতে, -O2সুইচ ফাইলের আকার হ্রাস করতে আউটপুট অ্যানিমেশনটিকে পুনরায় অনুকূল করে তোলে। জনবি'র নমুনা অ্যানিমেশন সহ, এটি আউটপুট আকারকে 27% হ্রাস করে।

  • seqকমান্ড মাত্র ২0 থেকে 99 সংখ্যার একটি ক্রম আউটপুট, 2. দ্য পদক্ষেপ আপ গণনা-f "#%g" করে তোলে একটি মুদ্রণ #প্রতিটি সংখ্যা, যার gifsicle একটি ফ্রেম নির্বাচন পরিবর্তে একটি ফাইলের নাম যেমন বুঝতে তোলে আগে। `Seq কমান্ডের চারপাশে ব্যাকটিক্স ( ) এর আউটপুটটিকে জিফসিকাল কমান্ড লাইনে প্যারামিটার হিসাবে অন্তর্ভুক্ত করে।

আপনি যদি জিআইএফ দ্রুত গতিতে না চান তবে আপনি gifsicle -I input.gifবর্তমান ফ্রেমের বিলম্ব পেতে, এটি 2 দিয়ে গুণ এবং ব্যবহার করতে পারেন gifsicle -d ${delay} ...


সুন্দরভাবে সম্পন্ন! আপনি যদি সত্যিই চাইতেন, তবে আমার স্ক্রিপ্ট থেকে গ্রেপটি সঠিকভাবে ফ্রেমের সংখ্যা দিতে (এবং একটি কমান্ডের এক বিহেমথ তৈরি করতে) ব্যবহার করতে পারেন। অথবা সম্ভবত কোনও অ্যানিমেটেড জিআইএফ-তে ফ্রেমের সংখ্যা ফেরত দেওয়ার সহজ উপায় আছে?
জনবি

3
আমি কমান্ডের এক মহিমাময়টি শেষ করেছিলাম, @ জনবি -gifsicle input.gif `seq -f "#%g" 0 2 $(identify input.gif | tail -1 | cut -d "[" -f2 - | cut -d "]" -f1 -)` --unoptimize -O2 -o output.gif
কসরা রাহজেরদী

সংস্করণ 1.71 সঙ্গে Windows 7 X64, আমি পেয়েছিলাম: useless unoptimization-related input option। সুতরাং আমি এটি দুটি ধাপে করেছি ( gifsicle -U -o unoptimized.gif input.gifgifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
গিত

11

দ্রষ্টব্য : কমান্ড লাইন / ওপেন সোর্স প্রয়োজনীয়তার আগে এই উত্তরটি পোস্ট করা হয়েছিল তবে ভবিষ্যতে অন্য কাউকে সাহায্য করতে পারে বলেই আমি এটিকে ছেড়ে দিচ্ছি


ফটোশপ ব্যবহার করা

এটি কোনও ওপেন সোর্স বা কমান্ড লাইন সমাধান নয়, তবে আপনি ফটোশপ দিয়ে এটি করতে পারেন:

ফাইলআমদানি ▸ স্তরে ভিডিও ফ্রেমগুলি ...

ভিডিও আমদানি করুন

" প্রতিটা সীমাবদ্ধ __ ফ্রেম " আপনার জন্য কৌশলটি করবে


0

ব্যাচ স্ক্রিপ্ট প্রসেসিং ব্যবহার করে আমার সমাধান এখানে ...

প্রথমে ক্যাপচার করা-আসল অ্যানিমেটেড জিআইএফ ইনপুট.gif ফাইলে অনুলিপি করুন তারপরে কমান্ড দোভাষী এবং টাইপ করুন:

জিফসিকল ইনপুট.gif -I "# -1"> ইনপুট.টি.এস.টি.

ইনপুট.টি.এস.টি.কে দেখুন এবং দেখুন অ্যানিমেশনের দৈর্ঘ্য কত - এতে কতগুলি ফ্রেম রয়েছে ...

ইনপুট.টেক্সট:

* input.gif 166 images
  logical screen 1366x768
  global color table [256]
  background 15
  loop forever
  + image #165 1x1 at 1365,767 transparent 15
    disposal asis delay 0.07s

তারপরে টেস্ট.ব্যাট সম্পাদনা করুন এবং ভেরিয়েবলের মান পরিবর্তন করুন = নির্দিষ্ট_ দৈর্ঘ্য_সংখ্যা_ফর্ম_ইনপুট.টেক্সট এবং টেস্ট.বাট সংরক্ষণ করুন ...

পরীক্ষা.বাট:

@echo off
set /A len=166
set /A i=1
set /A ii=0
:loop
if %i%==%len% goto :eof
if %ii%==0 (set /A ii=1) else (set /A ii=0)
set /A iii=%ii%*%i%
if %i%==%iii% echo gifsicle -b input.gif --delete "#1" --done
set /A i=%i%+1
goto :loop

তারপরে অবশেষে প্রক্রিয়া 1.bat এবং প্রক্রিয়া 2.bat শুরু করুন এবং প্রতিটি বিজোড় ফ্রেমের সাথে কাটা অ্যানিমেশনটি ফাইল ইনপুট.gif এ প্রক্রিয়া করা হবে

প্রক্রিয়া 1.bat:

gifsicle -b -U input.gif
test.bat > input.bat

প্রক্রিয়া 2.bat:

call "input.bat"
gifsicle -b -O2 input.gif
erase "input.bat"

0

আমার মনে হয় আমার আরও নতুন পরিশীলিত ব্যাখ্যা দরকার (ফ্রেমের বিলম্বও খুব গুরুত্বপূর্ণ বিষয় যা বিবেচনা করা উচিত) ... এই নতুন প্রক্রিয়ার জন্য আপনাকে এই লিঙ্কটি থেকে JREPL.BAT ডাউনলোড করতে হবে: http://www.dostips.com /forum/viewtopic.php?t=6044

প্রথমে ক্যাপচার করা জিএফ কে ইনপুট.আইপি ফাইলটিতে অনুলিপি করুন তারপরে কমান্ড দোভাষী এবং টাইপ করুন:

জিফসিকল ইনপুট.gif -I "# -1"> ইনপুট.টি.এস.টি.

ইনপুট.টি.এস.টি.কে দেখুন এবং দেখুন যে অ্যানিমেশনটির দৈর্ঘ্য কত - এতে কতগুলি ফ্রেম রয়েছে ... ফ্রেমের বিলম্বের দিকেও নজর দিন এবং যদি এর 0.07 এর মানে হল যে আপনাকে এই লাইনে বিকল্প -d14 (7msec * 2) স্থাপন করা উচিত প্রক্রিয়াকরণে: সিএমডি সম্পাদনা করার পরে gifsicle -b -U -d14 ইনপুট.gif এ

তারপরে টেস্ট.ব্যাট সম্পাদনা করুন এবং ভেরিয়েবলের 166 এর মান পরিবর্তন করুন এই লাইন থেকে অ্যানিমেশনের ফ্রেমের সংখ্যার সাথে মেলে: / L %% i IN (1,2,166) এর জন্য "# %% i" >> ইনপুট.ব্যাট, পরে প্রতিধ্বনি করুন টেস্ট.বাট সংরক্ষণ করুন সম্পাদনা করুন ...

তারপরে প্রক্রিয়া.এমডি শুরু করুন এবং প্রতিটি বিজোড় ফ্রেমের সাহায্যে ক্রপ করা অ্যানিমেশনটি ফাইল ইনপুট.আইফিতে প্রক্রিয়া করা হবে

পিএস এই পদ্ধতির সুবিধাটি হ'ল আপনি জিআইএফ (প্রতিটি দ্বিতীয় ফ্রেম (1,2,166), বা প্রতি তৃতীয় (1,3,166)) থেকে কী মুছতে চান তার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে এবং এর মধ্যে কেবল মাঝারি সংখ্যা পরিবর্তন করুন ব্যাচ লাইন, তবে সচেতন থাকুন যে আপনি যদি (1,3,166) নির্দিষ্ট করে থাকেন তবে পরিবর্তে (7msec * 3/2 = 10) প্রতিবিম্বিত করতে আপনার প্রসেস.cmd থেকে -d14 (বিলম্ব বিকল্প) পরিবর্তন করতে হবে, সুতরাং (7 ম্যাসি * 2) এর পরিবর্তে / 1 = 14), বিলম্বের জন্য বিকল্প হতে হবে -10 ...

অন্যান্য ফাইল (উদাহরণস্বরূপ প্রতিটি দ্বিতীয় ফ্রেম অপসারণ): test.bat:

@echo off
echo gifsicle -b input.gif --delete>> input.bat
for /L %%i IN (1,2,166) DO echo  "#%%i">> input.bat
echo  --done>> input.bat
call jrepl.bat "\n" "" /x /m /f input.bat /o -

প্রক্রিয়া.কম:

gifsicle -b -U -d14 input.gif
call "test.bat"
call "input.bat"
gifsicle -b -O3 input.gif
erase "input.bat"

এবং সহায়ক রিডমে ফাইল ইনপুট.টেক্সট:

* input.gif 166 images
  logical screen 1366x768
  global color table [256]
  background 15
  loop forever
  + image #165 1x1 at 1365,767 transparent 15
    disposal asis delay 0.07s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.