क्या कोई कृपया इस त्रुटि के साथ मेरी मदद कर सकता है। मैं क्वेरी स्ट्रिंग इमेज यूआरएल से एक छवि को बचाने की कोशिश कर रहा हूं। लेकिन निम्न त्रुटि के साथ फंस गया। नीचे मेरा कोड, कृपया अनावश्यक पुस्तकालयों को अनदेखा करें

from flask_restful import Resource, Api
import requests
import uuid
from PIL import Image
import urllib.request as urllib
import io

app = Flask(__name__)
api = Api(app)

abc = uuid.uuid4().hex[:6].upper()

class Predict(Resource):
    def get(self):
        url = request.args['url']
        r = requests.get(url)
        fd = urllib.urlopen(r)
        image_file = io.BytesIO(fd.read())
        im = Image.open(image_file)
        return im.save(abc+".png")


api.add_resource(Predict, '/')

if __name__ == "__main__":
    app.run("", port=7999, debug=True)

आउटपुट त्रुटि:

enter image description here

0
Jyothsna jyo 20 फरवरी 2020, 15:55
fd = urllib.urlopen(url) आज़माएं, आप किस अजगर संस्करण का उपयोग कर रहे हैं, यदि अजगर 3 है तो import urllib2 fd = urllib2.urlopen(url) का उपयोग करें
 – 
Shubham Shaswat
20 फरवरी 2020, 16:34
im.save(), None लौटाता है, इसलिए आपके return im.save(abc+".png") का मतलब return None है। इसके बजाय आपको कुछ Response वापस करना चाहिए।
 – 
furas
20 फरवरी 2020, 16:40
यदि आप url से छवि पढ़ते हैं तो आपको इसे सहेजने के लिए Image की आवश्यकता नहीं है, लेकिन सीधे खोलें(..., 'wb')` तथा write()
 – 
furas
20 फरवरी 2020, 16:45

2 जवाब

r = requests.get(url) एक प्रतिक्रिया वस्तु देता है और आप r.content को कॉल करके इसकी सामग्री को पढ़ सकते हैं, फिर इसे पढ़ने के लिए urlopen के साथ प्रतिक्रिया वस्तु को खोलने का प्रयास करने की आवश्यकता नहीं है

0
effy 20 फरवरी 2020, 16:38

फ़ाइल में सहेजने के लिए आपको Image और BytesIO() की आवश्यकता नहीं है - आप सीधे open() और write() का उपयोग कर सकते हैं

अगर आप हर इमेज को अलग-अलग नाम से सेव करना चाहते हैं तो आपको get() के अंदर abc बनाना चाहिए

from flask import Flask, request
from flask_restful import Resource, Api
import requests
import uuid

app = Flask(__name__)
api = Api(app)

#abc = uuid.uuid4().hex[:6].upper()  # one name for all images

class Predict(Resource):

    def get(self):
        abc = uuid.uuid4().hex[:6].upper()  # generate new name for new image
        filename = abc + '.png'
        #print(filename)

        url = request.args['url']

        r = requests.get(url)

        f = open(filename, 'wb')  # write in bytes-mode 'wb'
        f.write(r.content)
        f.close()

        return {'status': 'OK', 'name': filename}

api.add_resource(Predict, '/')

if __name__ == "__main__":
    app.run("", port=7999, debug=True)

आपको केवल Image और BytesIO की आवश्यकता होगी यदि आप सहेजने से पहले छवि को संपादित करना चाहते हैं।

from flask import Flask, request
from flask_restful import Resource, Api
import requests
import uuid
from PIL import Image
import io

app = Flask(__name__)
api = Api(app)

#abc = uuid.uuid4().hex[:6].upper() # one name for all images

class Predict(Resource):

    def get(self):
        abc = uuid.uuid4().hex[:6].upper()  # generate new name for new image
        filename = abc + '.png'
        #print(filename)

        url = request.args['url']

        r = requests.get(url)

        fp = io.BytesIO(r.content)
        img = Image.open(fp)

        img = img.resize( (800, 600) )  # resize image

        img.save(filename)

        return {'status': 'OK', 'name': filename}

api.add_resource(Predict, '/')

if __name__ == "__main__":
    app.run("", port=7999, debug=True)
0
furas 20 फरवरी 2020, 17:04
धन्यवाद, यह बहुत मददगार है। लेकिन अगर मैं उसी छवि का उपयोग किसी अन्य फ़ंक्शन में करना चाहता हूं।
 – 
Jyothsna jyo
21 फरवरी 2020, 07:42
यदि आप इसे अन्य अनुरोध में उपयोग करना चाहते हैं तो फ़ाइल (या डेटाबेस) में सहेजें और बाद में इसे फ़ाइल (या डेटाबेस) से पढ़ें।
 – 
furas
21 फरवरी 2020, 07:49