প্রোগ্রামিতভাবে পাইথনে ভিডিও বা অ্যানিমেটেড জিআইএফ উত্পন্ন?


221

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

সম্পাদনা: আমি ইতিমধ্যে পিআইএল চেষ্টা করেছি এবং এটি কাজ করে বলে মনে হচ্ছে না। কেউ এই উপসংহারের সাথে আমাকে সংশোধন করতে পারে বা অন্য একটি টুলকিট প্রস্তাব দিতে পারে? এই লিঙ্কটি পিআইএল সম্পর্কিত আমার উপসংহারটিকে ব্যাকআপ করে বলে মনে হচ্ছে: http://www.somethinkodd.com/oddthink/2005/12/06/python-imaging-library-pil-and-animated-gifs/

উত্তর:


281

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

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

দ্রুত এবং নোংরা সমাধান:

import imageio
images = []
for filename in filenames:
    images.append(imageio.imread(filename))
imageio.mimsave('/path/to/movie.gif', images)

দীর্ঘ সিনেমাগুলির জন্য, স্ট্রিমিং পদ্ধতির ব্যবহার করুন:

import imageio
with imageio.get_writer('/path/to/movie.gif', mode='I') as writer:
    for filename in filenames:
        image = imageio.imread(filename)
        writer.append_data(image)

37
এছাড়াও প্যারামিটার সময়কাল = 0.5 প্রতিটি ফ্রেমের জন্য 0.5 সেকেন্ড সময় নির্ধারণ করে।
এলেও

3
ভ্যালুএররার: 'i' মোডে নির্দিষ্ট ফাইলটি পড়ার জন্য কোনও ফর্ম্যাট খুঁজে পাওয়া যায়নি - আমি উইন্ডোজ ২.7 উইনিপথনে এই ত্রুটিটি পাচ্ছি। কোন সংকেত সনাক্ত করুন?
ভানকো

1
@ ভ্যাঙ্কো ত্রুটিটি ফাইলটি পড়ার সাথে সম্পর্কিত বলে মনে হচ্ছে, আপনি ইমেজিও.মিম্রেড চেষ্টা করতে পারেন, বা এটি যদি অনেক ফ্রেমযুক্ত সিনেমা হয় তবে এখানে পাঠক অবজেক্টটি ব্যবহার করুন: imageio.readthedocs.io/en/latest/…
Almar

2
@ অ্যালিও: "এছাড়াও প্যারামিটারের সময়কাল = 0.5 প্রতিটি ফ্রেমের জন্য 0.5 সেকেন্ড সময় নির্ধারণ করে"। চিত্রের জন্য একটি সময়কাল বৈশিষ্ট্য আছে? যদি তা হয় তবে এই নথিটি কোথায়? আমি সমস্ত দস্তাবেজগুলি পড়েছি এবং কোনও সময়কাল যুক্তির কোনও উল্লেখ পাইনি couldn't
ক্রিস নিলসন

3
অসাধারণ! imageio in anacondaফলন True, হ্যাঁ!
uhoh

47

ঠিক আছে, এখন আমি ইমেজম্যাগিক ব্যবহার করছি। আমি আমার ফ্রেমগুলিকে পিএনজি ফাইল হিসাবে সংরক্ষণ করি এবং তারপরে অ্যানিমেটেড জিআইএফ তৈরি করতে পাইথন থেকে ইমেজম্যাগিকের রূপান্তর.এক্সিকে অনুরোধ করি। এই পদ্ধতির সুন্দর জিনিসটি হ'ল আমি প্রতিটি ফ্রেমের জন্য পৃথকভাবে ফ্রেমের সময়কাল নির্দিষ্ট করতে পারি। দুর্ভাগ্যক্রমে এটি মেশিনে ইনস্টল হওয়া ইমেজম্যাগিকের উপর নির্ভর করে। তাদের একটি পাইথন র‍্যাপার রয়েছে তবে এটি দেখতে বেশ কৃপণ এবং অসমর্থিত। এখনও অন্যান্য পরামর্শ খুলুন।


21
আমি পাইথন লোক কিন্তু এখানে চিত্রম্যাগিকটি আরও সহজ পাওয়া গেছে। আমি শুধু ইমেজ আমার ক্রম তৈরি এবং ভালো কিছু দৌড়েconvert -delay 20 -loop 0 *jpg animated.gif
নিক

আমি সম্মতি জানাই, এটিই আমার সেরা সমাধান। এখানে একটি সংক্ষিপ্ত উদাহরণ (ব্যবহারকারী স্টিভ খ এর উদাহরণ কোড পোস্ট উপর ভিত্তি করে stackoverflow.com/questions/10922285/... :) pastebin.com/JJ6ZuXdz
andreasdr

ইমেজম্যাগিক ব্যবহার করে, আপনি সহজেই অ্যানিমেটেড জিআইএফ-র আকার পরিবর্তন করতে পারেন যেমনconvert -delay 20 -resize 300x200 -loop 0 *jpg animated.gif
জুন ওয়াং

@ নিক, জিআইএফ তৈরি করতে আপনি কীভাবে কোডটি চালাবেন? আমার কি স্পাইডার আইডিইতে কিছু আমদানি করা উচিত?
MOON

@MOON উপরে আমি যুক্ত করা চিত্রম্যাগিক কমান্ডটি কেবল কমান্ড লাইনের মাধ্যমে চালানো হবে।
নিক

43

২০০৯ সালের জুন পর্যন্ত মূলত উদ্ধৃত ব্লগ পোস্টের মন্তব্যে অ্যানিমেটেড জিআইএফ তৈরি করার একটি পদ্ধতি রয়েছে । চিত্র 2gif.py স্ক্রিপ্টটি ডাউনলোড করুন (পূর্ববর্তী চিত্র 2gif.py , সৌজন্যে আপডেট করুন)।

তারপরে, জিআইএম-তে ফ্রেমগুলি উল্টাতে, উদাহরণস্বরূপ:

#!/usr/bin/env python

from PIL import Image, ImageSequence
import sys, os
filename = sys.argv[1]
im = Image.open(filename)
original_duration = im.info['duration']
frames = [frame.copy() for frame in ImageSequence.Iterator(im)]    
frames.reverse()

from images2gif import writeGif
writeGif("reverse_" + os.path.basename(filename), frames, duration=original_duration/1000.0, dither=0)

2
এই স্ক্রিপ্টটির একটি নতুন সংস্করণ রয়েছে যা visvis.googlecode.com/hg/vvmovie/images2gif.py এ আরও ভাল মানের আউটপুট তৈরি করে এটি প্যাকেজ থেকে পৃথক পৃথক পৃথক স্ক্রিপ্ট হিসাবে ব্যবহার করা যেতে পারে।
ভৌগলিক

1
এই মন্তব্যে উল্লিখিত স্ক্রিপ্টটি ধারাবাহিকভাবে ম্যাকে ব্যবহার করার সময় আমার জন্য সেগমেন্টেশন ত্রুটি দেয়, এমনকি যখন কেবল চালানো হয় ( নাম___= '__ প্রধান ' উদাহরণ ব্যবহার করে)। আমি উত্তরে বর্ণিত স্ক্রিপ্টটি চেষ্টা করছি, আশা করি এটি সঠিকভাবে কাজ করবে। সম্পাদনা - আমি নিশ্চিত করতে পারি যে উপরের উত্তরে বর্ণিত লিপিটি আমার ম্যাকের সাথে সঠিকভাবে কাজ করে।
স্কুবো

6
বরং স্ক্রিপ্টটি ব্যবহার করে পাইপ ব্যবহার করুন উদাহরণস্বরূপ pip install visvis, আপনার স্ক্রিপ্টে from visvis.vvmovie.images2gif import writeGif
ড্যানিয়েল ফারেল

8
আমি উইন্ডোজ 8-এ পাইথন ২.7.৩ দিয়ে এটি চেষ্টা করেছি এবং আমি ইউনিকোড ডিকোড এরির পেয়েছি: 'এসকিআই' কোডেক 6xc8 পজিশনে ডিকোড করতে পারে না: অরডিনাল রেঞ্জ নয় (128)। থেকে পাইথন images2gif.py চলমান
হিসাব

3
আমি ভিসিভিস (এবং চিত্র 2gif) এর লেখক এবং এই উদ্দেশ্যে এটি ব্যবহার করার বিরুদ্ধে সুপারিশ করছি। আমি ইমেজিয়ো প্রকল্পের অংশ হিসাবে আরও ভাল সমাধানে কাজ করছি (আমার উত্তর দেখুন)।
Almar

40

আপনি কেবল পিআইএল (এটি ইনস্টল করুন pip install Pillow) ব্যবহার করে এটি কীভাবে করবেন তা এখানে :

import glob
from PIL import Image

# filepaths
fp_in = "/path/to/image_*.png"
fp_out = "/path/to/image.gif"

# https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif
img, *imgs = [Image.open(f) for f in sorted(glob.glob(fp_in))]
img.save(fp=fp_out, format='GIF', append_images=imgs,
         save_all=True, duration=200, loop=0)

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, আপনাকে ধন্যবাদ ক্রিস
ted930511

1
অ্যাসিটার্ক ভেরিয়েবল কী ধরে রাখে ("* imgs")?
denisb411

3
এটি অজগর ভাষার বৈশিষ্ট্য। এটি পুনরাবৃত্তিযোগ্য আনপ্যাকিং করে । আপনি মোটামুটিভাবে unpacking যেমন মনে করতে পারেন x = [a, b, c]থেকে *xযা ভাবা যেতে পারে a, b, c(পরিক্ষেপ বন্ধনী ছাড়া)। ফাংশান কল এসব সমার্থক আছেন: f(*x) == f(a, b, c)। টিপল আনপ্যাকিংয়ের ক্ষেত্রে এটি বিশেষত কার্যকর যেখানে আপনি পুনরাবৃত্তিযোগ্যকে একটি মাথা (প্রথম উপাদান) এবং একটি লেজ (বাকী) দিয়ে বিভক্ত করতে চান, যা আমি এই উদাহরণে করি।
ক্রিস

25

আমি ইমেজ 2 গিফ.পি ব্যবহার করেছি যা ব্যবহার করা সহজ। এটি ফাইল আকার দ্বিগুণ বলে মনে হচ্ছে ..

26 110 কেবি পিএনজি ফাইল, আমি 26 * 110 কেবি = 2860 কেবি আশা করেছি, তবে আমার_জিআইএফ.জিআইএফ ছিল 5.7 এমবি

জিআইএফ 8 বিট হওয়ায়, সুন্দর পিএনজি জিআইএফ-তে কিছুটা ঝাপসা হয়ে উঠেছে

আমি যে কোডটি ব্যবহার করেছি তা এখানে:

__author__ = 'Robert'
from images2gif import writeGif
from PIL import Image
import os

file_names = sorted((fn for fn in os.listdir('.') if fn.endswith('.png')))
#['animationframa.png', 'animationframb.png', 'animationframc.png', ...] "

images = [Image.open(fn) for fn in file_names]

print writeGif.__doc__
# writeGif(filename, images, duration=0.1, loops=0, dither=1)
#    Write an animated gif from the specified images.
#    images should be a list of numpy arrays of PIL images.
#    Numpy images of type float should have pixels between 0 and 1.
#    Numpy images of other types are expected to have values between 0 and 255.


#images.extend(reversed(images)) #infinit loop will go backwards and forwards.

filename = "my_gif.GIF"
writeGif(filename, images, duration=0.2)
#54 frames written
#
#Process finished with exit code 0

26 ফ্রেমের মধ্যে 3 টি এখানে:

26 ফ্রেমের 3 টি এখানে

চিত্রগুলি সঙ্কুচিত করার ফলে আকার হ্রাস হয়েছে:

size = (150,150)
for im in images:
    im.thumbnail(size, Image.ANTIALIAS)

ছোট gif


আমি এই সম্পর্কে একটি ব্লগ পোস্ট করেছি .. রবার্ট-king.com/#post2-python-makes-gif
রবার্ট রাজা

2
আমি ত্রুটিগুলি পেয়েছি .. ফাইল "সি: \ পাইথন 27 \ lib \ images2gif.py", লাইন 418, লেখার জন্য GifToFile গ্লোবাল প্যালেট = প্যালেট [ঘটায়.আইডিএক্স (সর্বাধিক (ঘটবে))] ভ্যালুয়েরর: সর্বাধিক () আরগ একটি খালি ক্রম
হ্যারি

সংঘটিত সম্ভবত খালি। আমার ইমেজ 2gif.py ফাইলে কোনও "গ্লোবাল প্যালেট" পরিবর্তনশীল নেই।
রবার্ট রাজা

আমি কীভাবে এটি পরিবর্তন করব? আমি সেখানে খুব সাম্প্রতিক চিত্র 2gif.py স্ক্রিপ্টটি ব্যবহার করছি ( bit.ly/XMMn5h )
হ্যারি

4
কোডটি সহ রবার্টিং করতে গিয়ে আমি বলতে একটি ত্রুটি পেয়েছিfp.write(globalPalette) TypeError: must be string or buffer, not list
এলডাব্লুজেড

19

একটি ভিডিও তৈরি করতে, আপনি ওপেনসিভি ব্যবহার করতে পারেন ,

#load your frames
frames = ...
#create a video writer
writer = cvCreateVideoWriter(filename, -1, fps, frame_size, is_color=1)
#and write your frames in a loop if you want
cvWriteFrame(writer, frames[i])

9

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

অন্যান্য সমস্যার সাথে এই পর্যন্ত সমস্যা:
1) সময়কালটি কীভাবে সংশোধন করা হয় সে সম্পর্কে কোনও স্পষ্ট সমাধান নেই
2) জিআইএফগুলির জন্য প্রয়োজনীয় আদেশ আদেশের পুনরাবৃত্তির কোনও সমাধান নেই
3) পাইথন 3 এর জন্য চিত্র কীভাবে ইনস্টল করবেন সে সম্পর্কে কোনও ব্যাখ্যা নেই

চিত্রটি ইনস্টল করুন: পাইথন 3-মি পিপ ইমেজ ইনস্টল করুন

দ্রষ্টব্য: আপনি নিশ্চিত করতে চাইবেন যে আপনার ফ্রেমগুলি ফাইলের নাম অনুসারে কিছু প্রকারের সূচি রয়েছে যাতে সেগুলি সাজানো যায়, অন্যথায় জিআইএফ কোথায় শুরু হয় বা শেষ হয় তা জানার কোনও উপায় আপনার নেই you'll

import imageio
import os

path = '/Users/myusername/Desktop/Pics/' # on Mac: right click on a folder, hold down option, and click "copy as pathname"

image_folder = os.fsencode(path)

filenames = []

for file in os.listdir(image_folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ):
        filenames.append(filename)

filenames.sort() # this iteration technique has no built in order, so sort the frames

images = list(map(lambda filename: imageio.imread(filename), filenames))

imageio.mimsave(os.path.join('movie.gif'), images, duration = 0.04) # modify duration as needed

1
sortযদি আপনার নম্বর স্কিমটি শীর্ষস্থানীয় শূন্যগুলি অন্তর্ভুক্ত না করে তবে অপ্রত্যাশিত ফলাফল হতে পারে। এছাড়াও কেন আপনি সাধারণ তালিকা বোঝার পরিবর্তে মানচিত্র ব্যবহার করেছেন?
নোহস

আমি করার পরামর্শ দিইfilenames.append(os.path.join(path, filename))
18:25

সেকডিং নোহস, images = [imageio.imread(f) for f in filenames]পরিষ্কার, দ্রুত এবং আরও অজগর।
ব্র্যান্ডন ডাব

6

গত বছর যেমন ওয়ারেন বলেছিলেন , এটি একটি পুরানো প্রশ্ন। যেহেতু লোকেরা এখনও পৃষ্ঠাটি দেখছে বলে মনে হচ্ছে, তাই আমি তাদের আরও আধুনিক সমাধানে পুনর্নির্দেশ করতে চাই। ভালো লেগেছে blakev বলেন এখানে , সেখানে একটি বালিশ উদাহরণ GitHub

 import ImageSequence
 import Image
 import gifmaker
 sequence = []

 im = Image.open(....)

 # im is your original image
 frames = [frame.copy() for frame in ImageSequence.Iterator(im)]

 # write GIF animation
 fp = open("out.gif", "wb")
 gifmaker.makedelta(fp, frames)
 fp.close()

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



5

পুরানো প্রশ্ন, প্রচুর ভাল উত্তর, তবে এখনও অন্য বিকল্পে আগ্রহ থাকতে পারে ...

numpngwমডিউল যে আমি সম্প্রতি GitHub (চালু করা https://github.com/WarrenWeckesser/numpngw ) numpy বিন্যাসগুলি থেকে অ্যানিমেটেড PNG ফাইল লিখতে পারেন। ( আপডেট : numpngwএখন পাইপিতে রয়েছে: https://pypi.python.org/pypi/numpngw ।)

উদাহরণস্বরূপ, এই স্ক্রিপ্ট:

import numpy as np
import numpngw


img0 = np.zeros((64, 64, 3), dtype=np.uint8)
img0[:32, :32, :] = 255
img1 = np.zeros((64, 64, 3), dtype=np.uint8)
img1[32:, :32, 0] = 255
img2 = np.zeros((64, 64, 3), dtype=np.uint8)
img2[32:, 32:, 1] = 255
img3 = np.zeros((64, 64, 3), dtype=np.uint8)
img3[:32, 32:, 2] = 255
seq = [img0, img1, img2, img3]
for img in seq:
    img[16:-16, 16:-16] = 127
    img[0, :] = 127
    img[-1, :] = 127
    img[:, 0] = 127
    img[:, -1] = 127

numpngw.write_apng('foo.png', seq, delay=250, use_palette=True)

তৈরি করে:

অ্যানিমেটেড png

অ্যানিমেশনটি দেখতে আপনার এমন একটি ব্রাউজার দরকার যা অ্যানিমেটেড পিএনজি সমর্থন করে (সরাসরি বা প্লাগইন সহ)।


ক্রোম এখন, বিটিডাব্লুও করে। একটি প্রশ্ন - Seq একটি পুনরাবৃত্তিযোগ্য হতে পারে? আপনি কি "স্ট্রিমিং" (অর্থাত্ লক্ষ্যযুক্ত এপিএনজি খোলার, এবং লুপে একে একে ফ্রেম যোগ করা) সমর্থন করেন?
টমাসজ গ্যান্ডার

এটি একটি নির্বিচারে পুনরাবৃত্তিযোগ্য বা স্ট্রিমিং সমর্থন করে না, তবে এর অর্থ এই নয় যে এটি ভবিষ্যতে পারে না। :) প্রস্তাবিত বর্ধনের সাথে গিথুব পৃষ্ঠায় একটি সমস্যা তৈরি করুন । এই বৈশিষ্ট্যটির জন্য এপিআই সম্পর্কে আপনার যদি কোনও ধারণা থাকে তবে দয়া করে তাদের এই সমস্যাটিতে বর্ণনা করুন।
ওয়ারেন ওয়েকেকসার

আমার কিছু অদ্ভুত ত্রুটি হয়েছিল যা আমি আপনার রেপোতে একটি সমস্যা তৈরি করেছি।
mLstudent33

5

উপরে উল্লিখিত একজন সদস্য হিসাবে, ইমেজিয়ো এটি করার একটি দুর্দান্ত উপায়। ইমেজও আপনাকে ফ্রেম রেট সেট করতে দেয় এবং আমি পাইথনে আসলে একটি ফাংশন লিখেছিলাম যা আপনাকে চূড়ান্ত ফ্রেমের উপর একটি হোল্ড সেট করতে দেয়। আমি এই ফাংশনটি বৈজ্ঞানিক অ্যানিমেশনগুলির জন্য ব্যবহার করি যেখানে লুপিং দরকারী তবে তাৎক্ষণিক পুনরায় আরম্ভ হবে না। এখানে লিঙ্ক এবং ফাংশন:

পাইথন ব্যবহার করে কীভাবে জিআইএফ তৈরি করতে হয়

import matplotlib.pyplot as plt
import os
import imageio

def gif_maker(gif_name,png_dir,gif_indx,num_gifs,dpi=90):
    # make png path if it doesn't exist already
    if not os.path.exists(png_dir):
        os.makedirs(png_dir)

    # save each .png for GIF
    # lower dpi gives a smaller, grainier GIF; higher dpi gives larger, clearer GIF
    plt.savefig(png_dir+'frame_'+str(gif_indx)+'_.png',dpi=dpi)
    plt.close('all') # comment this out if you're just updating the x,y data

    if gif_indx==num_gifs-1:
        # sort the .png files based on index used above
        images,image_file_names = [],[]
        for file_name in os.listdir(png_dir):
            if file_name.endswith('.png'):
                image_file_names.append(file_name)       
        sorted_files = sorted(image_file_names, key=lambda y: int(y.split('_')[1]))

        # define some GIF parameters

        frame_length = 0.5 # seconds between frames
        end_pause = 4 # seconds to stay on last frame
        # loop through files, join them to image array, and write to GIF called 'wind_turbine_dist.gif'
        for ii in range(0,len(sorted_files)):       
            file_path = os.path.join(png_dir, sorted_files[ii])
            if ii==len(sorted_files)-1:
                for jj in range(0,int(end_pause/frame_length)):
                    images.append(imageio.imread(file_path))
            else:
                images.append(imageio.imread(file_path))
        # the duration is the time spent on each image (1/duration is frame rate)
        imageio.mimsave(gif_name, images,'GIF',duration=frame_length)

এই পদ্ধতিটি ব্যবহার করে জিআইএফের উদাহরণ



4

উইন্ডোজ 7, ​​পাইথন 2.7, ওপেনসিভি 3.0 দিয়ে আমার সাথে নিম্নলিখিতটি কাজ করে:

import cv2
import os

vvw           =   cv2.VideoWriter('mymovie.avi',cv2.VideoWriter_fourcc('X','V','I','D'),24,(640,480))
frameslist    =   os.listdir('.\\frames')
howmanyframes =   len(frameslist)
print('Frames count: '+str(howmanyframes)) #just for debugging

for i in range(0,howmanyframes):
    print(i)
    theframe = cv2.imread('.\\frames\\'+frameslist[i])
    vvw.write(theframe)

3

সবচেয়ে সহজ জিনিসটি যা এটি আমার পক্ষে কাজ করে তা হ'ল পাইথনে শেল কমান্ড কল করা।

যদি আপনার চিত্রগুলি dummy_image_1.png, dummy_image_2.png ... dummy_image_N.png এর মতো সঞ্চয় করা থাকে তবে আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

import subprocess
def grid2gif(image_str, output_gif):
    str1 = 'convert -delay 100 -loop 1 ' + image_str  + ' ' + output_gif
    subprocess.call(str1, shell=True)

শুধু চালানো:

grid2gif("dummy_image*.png", "my_output.gif")

এটি আপনার gif ফাইলটি আমার_আউটপুট.gif তৈরি করবে।


2

চিত্র ফাইলের ক্রম হিসাবে একই ফোল্ডার থেকে দুটি লাইন পাইথন স্ক্রিপ্ট চালিয়ে কাজটি সম্পন্ন করা যায়। Png ফর্ম্যাট ফাইলগুলির জন্য স্ক্রিপ্টটি হ'ল -

from scitools.std import movie
movie('*.png',fps=1,output_file='thisismygif.gif')

1
এটি চেষ্টা করে ... পাইথন ২.6 এর অধীনে আমার পক্ষে কাজ করেনি। ফেরত দিয়েছে: "scitools.easyviz.movie ফাংশন কমান্ড রান। / রূপান্তর -delay 100 g4testC: _ * PNG g4testC.gif / অবৈধ প্যারামিটার - 100"
ড্যান এইচ

সমস্যাটি পাইথনের সাথে অবশ্যই নেই। আপনার সিস্টেমে চিত্রম্যাগিক পুনরায় ইনস্টল করুন এবং আবার চেষ্টা করুন।

2

আমি একটি একক লাইন কোড সন্ধান করছিলাম এবং আমার অ্যাপ্লিকেশনটির জন্য কাজ করতে নিম্নলিখিতটি পেয়েছি। আমি যা করেছি তা এখানে:

প্রথম পদক্ষেপ: নীচের লিঙ্ক থেকে ইমেজম্যাগিক ইনস্টল করুন

https://www.imagemagick.org/script/download.php

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

দ্বিতীয় পদক্ষেপ: সেমিডিআর লাইনটি ফোল্ডারে যেখানে পয়েন্টগুলি (আমার ক্ষেত্রে .png ফর্ম্যাটে) স্থাপন করা হয়েছে সেদিকে নির্দেশ করুন

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

তৃতীয় পদক্ষেপ: নিম্নলিখিত কমান্ডটি টাইপ করুন

magick -quality 100 *.png outvideo.mpeg

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

ধারণার জন্য ধন্যবাদ ফোগলবার্ড!


0

আমি কেবল নিম্নলিখিতগুলি ব্যবহার করে দেখেছি এবং খুব দরকারী:

প্রথমে গ্রন্থাগারগুলি Figtodatএবং images2gifআপনার স্থানীয় ডিরেক্টরিতে ডাউনলোড করুন ।

দ্বিতীয়ত পরিসংখ্যানগুলি একটি অ্যারেতে সংগ্রহ করুন এবং এনিমেটেড জিআইএফ-তে রূপান্তর করুন:

import sys
sys.path.insert(0,"/path/to/your/local/directory")
import Figtodat
from images2gif import writeGif
import matplotlib.pyplot as plt
import numpy

figure = plt.figure()
plot   = figure.add_subplot (111)

plot.hold(False)
    # draw a cardinal sine plot
images=[]
y = numpy.random.randn(100,5)
for i in range(y.shape[1]):
    plot.plot (numpy.sin(y[:,i]))  
    plot.set_ylim(-3.0,3)
    plot.text(90,-2.5,str(i))
    im = Figtodat.fig2img(figure)
    images.append(im)

writeGif("images.gif",images,duration=0.3,dither=0)

0

আমি পিআইএল এর ইমেজ সিক্যুয়েন্স মডিউলটি নিয়ে এসেছি , যা আরও ভাল (এবং আরও মানক) জিআইএফ অ্যানিমেশনের জন্য প্রস্তাব করে। আমিও টাকা এর ব্যবহার পর () পদ্ধতি এই সময়, যা বেশী ভালো time.sleep ()

from Tkinter import * 
from PIL import Image, ImageTk, ImageSequence

def stop(event):
  global play
  play = False
  exit() 

root = Tk()
root.bind("<Key>", stop) # Press any key to stop
GIFfile = {path_to_your_GIF_file}
im = Image.open(GIFfile); img = ImageTk.PhotoImage(im)
delay = im.info['duration'] # Delay used in the GIF file 
lbl = Label(image=img); lbl.pack() # Create a label where to display images
play = True;
while play:
  for frame in ImageSequence.Iterator(im):
    if not play: break 
    root.after(delay);
    img = ImageTk.PhotoImage(frame)
    lbl.config(image=img); root.update() # Show the new frame/image

root.mainloop()

0

একটি সাধারণ ফাংশন যা জিআইএফ তৈরি করে:

import imageio
import pathlib
from datetime import datetime


def make_gif(image_directory: pathlib.Path, frames_per_second: float, **kwargs):
    """
    Makes a .gif which shows many images at a given frame rate.
    All images should be in order (don't know how this works) in the image directory

    Only tested with .png images but may work with others.

    :param image_directory:
    :type image_directory: pathlib.Path
    :param frames_per_second:
    :type frames_per_second: float
    :param kwargs: image_type='png' or other
    :return: nothing
    """
    assert isinstance(image_directory, pathlib.Path), "input must be a pathlib object"
    image_type = kwargs.get('type', 'png')

    timestampStr = datetime.now().strftime("%y%m%d_%H%M%S")
    gif_dir = image_directory.joinpath(timestampStr + "_GIF.gif")

    print('Started making GIF')
    print('Please wait... ')

    images = []
    for file_name in image_directory.glob('*.' + image_type):
        images.append(imageio.imread(image_directory.joinpath(file_name)))
    imageio.mimsave(gif_dir.as_posix(), images, fps=frames_per_second)

    print('Finished making GIF!')
    print('GIF can be found at: ' + gif_dir.as_posix())


def main():
    fps = 2
    png_dir = pathlib.Path('C:/temp/my_images')
    make_gif(png_dir, fps)

if __name__ == "__main__":
    main()

0

আমি বুঝতে পেরেছি যে আপনি চিত্রগুলিকে জিআইএফ রূপান্তর করার বিষয়ে জিজ্ঞাসা করেছেন; তবে, যদি আসল ফর্ম্যাটটি এমপি 4 হয় তবে আপনি এফএফম্পেগ ব্যবহার করতে পারেন :

ffmpeg -i input.mp4 output.gif

-1

এটি সত্যিই অবিশ্বাস্য ... সকলেই একটি অ্যানিমেটেড জিআইএফ খেলার জন্য কিছু বিশেষ প্যাকেজটির প্রস্তাব দিচ্ছেন, এই মুহূর্তে টিন্টার এবং ক্লাসিক পিআইএল মডিউলটি দিয়ে এটি করা যেতে পারে!

এখানে আমার নিজস্ব জিআইএফ অ্যানিমেশন পদ্ধতি রয়েছে (আমি কিছুক্ষণ আগে তৈরি করেছি)। খুব সহজ:

from Tkinter import * 
from PIL import Image, ImageTk
from time import sleep

def stop(event):
  global play
  play = False
  exit() 

root = Tk()
root.bind("<Key>", stop) # Press any key to stop
GIFfile = {path_to_your_GIF_file}    
im = Image.open(GIFfile); img = ImageTk.PhotoImage(im)
delay = float(im.info['duration'])/1000; # Delay used in the GIF file 
lbl = Label(image=img); lbl.pack() # Create a label where to display images
play = True; frame = 0
while play:
  sleep(delay);
  frame += 1
  try:
    im.seek(frame); img = ImageTk.PhotoImage(im)
    lbl.config(image=img); root.update() # Show the new frame/image
  except EOFError:
    frame = 0 # Restart

root.mainloop()

আপনি অ্যানিমেশন বন্ধ করতে আপনার নিজস্ব উপায় সেট করতে পারেন। আপনি যদি প্লে / বিরতি / বোতাম ছেড়ে দেওয়ার সাথে পুরো সংস্করণটি পেতে চান তবে আমাকে জানান।

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


1
sleepজিইউআইয়ের মূল থ্রেডে ফোন করা সাধারণত ভাল আদর্শ নয় । afterপর্যায়ক্রমে একটি ফাংশন কল করতে আপনি পদ্ধতিটি ব্যবহার করতে পারেন ।
ব্রায়ান ওকলে

আপনি ঠিক বলেছেন, কিন্তু এটি মোটেও পয়েন্ট নয়, তাই না? পয়েন্টটি পুরো পদ্ধতিটি। সুতরাং, আমি বরং এটির প্রতিক্রিয়া আশা করব!
অ্যাপোস্টোলোস

1
আমি আপনার উত্তরটি কীভাবে উন্নত করব সে সম্পর্কে পরামর্শ দেওয়ার চেষ্টা করছিলাম।
ব্রায়ান ওকলে

বিটিডাব্লু, আমি সাধারণত tk.after()নিজেকে ব্যবহার করি। তবে এখানে কোডটি যথাসম্ভব সহজ করা দরকার। এই জিআইএফ অ্যানিমেশন পদ্ধতিটি যে কেউ ব্যবহার করেন তিনি তার নিজস্ব বিলম্বের ক্রিয়াটি প্রয়োগ করতে পারেন।
অ্যাপোস্টোলোস

শেষ পর্যন্ত! হ্যাঁ, এটি সত্যই একটি খুব ভাল পয়েন্ট। আমি অফ-টপিক ছিলাম! ধন্যবাদ, @ নভেল (অন্যরা কীভাবে এটি মিস করেছে তা দেখতে আকর্ষণীয় উদাহরণস্বরূপ ব্রায়ান, যিনি সময় বিলম্বের পদ্ধতি সম্পর্কে কথা বলছিলেন!)
অ্যাপস্টোলোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.