পাইথনের কোনও ইউআরএল থেকে আমি কীভাবে চিত্রের ডেটা পড়ব?


180

যখন আমরা একটি স্থানীয় ফাইলের সাথে কাজ করি তখন আমি যা করার চেষ্টা করি তা মোটামুটি সহজ, তবে আমি যখন একটি দূরবর্তী URL দিয়ে এটি করার চেষ্টা করি তখন সমস্যাটি আসে।

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

আমার যা আছে তা এখানে:

Image.open(urlopen(url))

এটি অভিযোগ seek()পাওয়া যায় না যে উপলভ্য নয়, তাই আমি এটি চেষ্টা করেছিলাম:

Image.open(urlopen(url).read())

তবে সেটাও কার্যকর হয়নি। এটি করার আরও ভাল উপায় আছে, বা কোনও অস্থায়ী ফাইলে এই ধরণের কাজ করার স্বীকৃত পদ্ধতিতে লিখতে হচ্ছে?


উত্তর:


279

পাইথন 3-এ স্ট্রিংআইও এবং সিস্ট্রিংআইও মডিউলগুলি গেছে।

পাইথন 3 এ আপনার ব্যবহার করা উচিত:

from PIL import Image
import requests
from io import BytesIO

response = requests.get(url)
img = Image.open(BytesIO(response.content))

প্রতিক্রিয়া.কমেন্ট থেকে চিত্রটি কীভাবে ফিরে পাবেন?
অমরেশ গিরি

requestsইউআরএল থেকে চিত্র আনার সময় প্যাকেজ 503 স্থিতি কোড ছুড়ে দেয়। পরিবর্তে, http.clientছবিটি পেতে আমাকে অবলম্বন করতে হয়েছিল।
মনীশঙ্কর সিং

আমি যখন এটিকে চেষ্টা করি তখন: অ্যাট্রিবিউটআরার: মডিউল 'অনুরোধগুলির' কোনও 'গেট' থাকে না।
এপিলজিক

2
বাইটসআইওতে ম্যানুয়ালি মোড়ানোর জন্য আর প্রয়োজন নেই পিআইএল> = 2.8.0 থেকে। শুধু ব্যবহার Image.open(response.raw)। পিআইএল স্বয়ংক্রিয়ভাবে এখন সেটির জন্য পরীক্ষা করে এবং বাইটসআইওটি হুডের নীচে মোড়ক করে। থেকে: pillow.readthedocs.io/en/3.0.x/releasenotes/2.8.0.html
এম

ধন্যবাদ ইউউইউউউউউউউউউ, ওপি।
শার্ল শেরিফ

166

আপনি একটি স্ট্রিংআইও ব্যবহার করে দেখতে পারেন

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)

ধন্যবাদ, ঠিক যুক্ত করতে চাই যে একই সঠিক কোডটি urllib2 (
পাইথন

17
অজগর 3 এ urlib.request আমদানি urlopen এবং io.io.BytesIO স্ট্রিংআইও এর পরিবর্তে হবে
matyas

2
সাহায্য করুন, IOError: <0x7fb91b6a29b0 এ _io.BytesIO বস্তুর> ইমেজ ফাইল সনাক্ত করতে পারে না আমার URL হল: ... মডেল = product.template & আইডি = 16 & ক্ষেত্র = image_medium
С. Дэлгэрцэцэг

56

আমি অনুরোধের লাইব্রেরি ব্যবহার করি। এটি আরও দৃ be় বলে মনে হচ্ছে।

from PIL import Image
import requests
from StringIO import StringIO

response = requests.get(url)
img = Image.open(StringIO(response.content))

3
কিছু কারণে urllib কিছু URL গুলি ব্যবহার করে না, তবে যেখানে ব্যর্থ হয়েছিল অনুরোধগুলি কাজ করেছে
mirri66

আমি পিআইএল প্যাকেজটি খুঁজে পাইনি, তবে দেখে মনে হচ্ছে বালিশটি পিআইএল প্রচেষ্টা গ্রহণ করেছে এবং আপনি পাইথন 3 এর জন্য ইনস্টল করতে পারেন pip3.4 install pillow
বিঘ্নজনক

3
নোট করুন যে অনুরোধগুলি পুরো প্রতিক্রিয়াটিকে মেমোরিতে লোড করবে এবং তারপরে পিআইএল পুরো চিত্রটি আবার একটি চিত্র হিসাবে লোড করবে, সুতরাং আপনার দুটি স্মৃতিতে মেমরির অনুলিপি রয়েছে। Urllib পদ্ধতি ব্যবহার করে পূর্ববর্তী উত্তরটি ডেটা প্রবাহিত করে, সুতরাং আপনি কেবলমাত্র একটি অনুলিপি এবং স্ট্রিমিং বাফার আকারটি দিয়ে শেষ করতে পারেন। আপনি অনুরোধগুলির সাথেও ডেটা স্ট্রিম করতে পারেন, তবে প্রতিক্রিয়া পড়ার () শব্দার্থকে সমর্থন করে না বলে আপনাকে একটি অ্যাডাপ্টার তৈরি করতে হবে।
srododger

@ sirdodger আপনি urllib2 বা urllib উল্লেখ করছেন?
সিএমসিডিগ্রাগনকাই

@ CMCDragonkai আমি গৃহীত urllib উত্তরের উল্লেখ করছি। যদি মেমরির ওভারহেড কোনও উদ্বেগ হয় তবে এই অনুরোধগুলির উত্তরটি ব্যবহার করা ভাল than (তবে, আমি যেমনটি বলেছি, অনুরোধগুলি ব্যবহার করে ভিন্ন সমাধান একই প্রভাব অর্জন করতে পারে))
সিডরডজার

42

আপনারা যারা বালিশ ব্যবহার করেন তাদের জন্য, সংস্করণ ২.৮.০ থেকে আপনি পারেন:

from PIL import Image
import urllib2

im = Image.open(urllib2.urlopen(url))

বা আপনি যদি ব্যবহার করেন requests:

from PIL import Image
import requests

im = Image.open(requests.get(url, stream=True).raw)

তথ্যসূত্র:


27

StringIOপঠন স্ট্রিংটিকে ফাইল-জাতীয় বস্তুতে পরিণত করতে ব্যবহার করুন :

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.requests.urlopen(url).read()))

21

যারা কিছু স্কেলারন / নম্পি পোস্ট প্রসেসিং করছেন (অর্থাত ডিপ লার্নিং) আপনি পিআইএল অবজেক্টটি এনপি.আরে () দিয়ে মোড়াতে পারবেন। এটি আপনার মতো গুগলে রাখার হাত থেকে বাঁচাতে পারে:

from PIL import Image
import requests
import numpy as np
from StringIO import StringIO

response = requests.get(url)
img = np.array(Image.open(StringIO(response.content)))

19

পাইথন ঘ

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen(url))
img

জুপিটার নোটবুক এবং আইপিথন

import IPython
url = 'https://newevolutiondesigns.com/images/freebies/colorful-background-14.jpg'
IPython.display.Image(url, width = 250)

অন্যান্য পদ্ধতির মতো নয়, এই পদ্ধতিটি লুপের জন্যও কাজ করে!


12

এই দিনগুলিতে ইমেজ ইনপুট / আউটপুট করার তর্কযুক্ত পরামর্শ দেওয়া উপায় হ'ল ডেডিকেটেড প্যাকেজ ইমেজআইও । একটি সাধারণ লাইন কোডের সাথে চিত্রের ডেটা সরাসরি URL থেকে পড়তে পারে:

from imageio import imread
image = imread('https://cdn.sstatic.net/Sites/stackoverflow/img/logo.png')

এই পৃষ্ঠায় অনেক উত্তর সেই প্যাকেজটি প্রকাশের পূর্বাভাস দেয় এবং তাই এটি উল্লেখ করে না। ইমেজআইও সাইকিট -ইমেজ টুলকিটের উপাদান হিসাবে শুরু হয়েছিল । এটি জনপ্রিয় ইমেজ-প্রসেসিং লাইব্রেরি পিল্লো সরবরাহ করে যাগুলির উপরে বেশ কয়েকটি বৈজ্ঞানিক বিন্যাস সমর্থন করে । এটি পুরোপুরি চিত্রের ইনপুট / আউটপুটকে কেন্দ্র করে একটি পরিষ্কার এপিআইতে এগুলি আবৃত করে। প্রকৃতপক্ষে, SciPy ইমেজআইওর পক্ষে তার নিজস্ব চিত্র পাঠক / লেখককে সরিয়ে দিয়েছে ।


3

চিত্রটি ক্রোমে নির্বাচন করুন, তার ডানদিকে ক্লিক করুন, ক্লিক করুন Copy image address, ছবিটি পড়তে একটি strপরিবর্তনশীল ( my_url) এ আটকান :

import shutil
import requests

my_url = 'https://www.washingtonian.com/wp-content/uploads/2017/06/6-30-17-goat-yoga-congressional-cemetery-1-994x559.jpg'
response = requests.get(my_url, stream=True)
with open('my_image.png', 'wb') as file:
    shutil.copyfileobj(response.raw, file)
del response

ইহা খোল;

from PIL import Image

img = Image.open('my_image.png')
img.show()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.