আমি কি কোনও ইউআরএল থেকে একটি ইউআইআইজেড লোড করতে পারি?


134

আমার একটি চিত্রের জন্য একটি ইউআরএল রয়েছে (এটি ইউআইআইমেজপিকার কনট্রোলার থেকে পেয়েছে) তবে আমার আর এই চিত্রটির মেমোরিতে নেই (ইউআরএলটি অ্যাপ্লিকেশনটির পূর্ববর্তী রান থেকে সংরক্ষণ করা হয়েছিল)। আমি কি আবার ইউআরএল থেকে ইউআইআইজেড পুনরায় লোড করতে পারি?

আমি দেখতে পাচ্ছি যে ইউআইআইএমেজে একটি ছবি রয়েছে উইথ কনটেন্টস অফফাইলে: তবে আমার একটি ইউআরএল রয়েছে। ইউআরএল পড়তে আমি কী এনএসডাটার ডেটাউইট কনটেন্টস অফ ইউআরএল ব্যবহার করতে পারি?

EDIT1


@ ড্যানিয়েলের উত্তরের ভিত্তিতে আমি নিম্নলিখিত কোডটি চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয় না ...

NSLog(@"%s %@", __PRETTY_FUNCTION__, photoURL);     
if (photoURL) {
    NSURL* aURL = [NSURL URLWithString:photoURL];
    NSData* data = [[NSData alloc] initWithContentsOfURL:aURL];
    self.photoImage = [UIImage imageWithData:data];
    [data release];
}

যখন আমি এটি চালিয়েছিলাম কনসোলটি দেখায়:

-[PhotoBox willMoveToWindow:] file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG
*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0'

:, relativeToURL তারপর initWithString: কল স্ট্যাক, আমি URLWithString আহ্বান করছি, যা URLWithString আহ্বান এ খুঁজছি relativeToURL :, তারপর _CFStringIsLegalURLString, তারপর CFStringGetLength, তারপর forwarding_prep_0 , তারপর ফরওয়ার্ডিং , তারপর - [NSObject doesNotRecognizeSelector]।

আমার এনএসএস স্ট্রিং (ফটোআরএল এর ঠিকানা 0x536fbe0) কেন দৈর্ঘ্যে সাড়া দেয় না এমন কোনও ধারণা? এটি কেন বলে যে এটি সাড়া দেয় না - [এনএসআরএল দৈর্ঘ্য]? এটি কি জানে না যে পরম একটি এনএসএসআর্টিং, কোনও এনএসআরএল নয়?

EDIT2


ঠিক আছে, কোডটি নিয়ে একমাত্র সমস্যা হ'ল ইউআরএল রূপান্তরকরণের স্ট্রিং। আমি যদি স্ট্রিংটিকে হার্ডকোড করি, তবে সমস্ত কিছু ঠিকঠাক কাজ করে। সুতরাং আমার এনএসএসআরটিংয়ের সাথে কিছু ভুল আছে এবং আমি যদি এটি অনুধাবন করতে না পারি তবে আমার ধারণা এটি অন্যরকম প্রশ্ন হিসাবে চলে। এই লাইনটি প্রবেশ করানোর সাথে (উপরে কনসোল লগ থেকে আমি পথটি পেস্ট করেছি), এটি দুর্দান্ত কাজ করে:

photoURL = @"file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG";

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

@ ড্রড: দস্তাবেজগুলিতে একটি ত্রুটি বলে মনে হচ্ছে। এটি বলে যে UIImagePickerControllerMediaURL একটি এনএসএসস্ট্রিং তবে এটি আসলে একটি এনএসআরএল অবজেক্ট।
প্রগ্রেমার

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

আমি দ্বিতীয় (তৃতীয়?) ডিআইএলজিজেডলডার। এই পৃষ্ঠায় এটি সম্পর্কে মন্তব্যগুলি উদ্দেশ্যমূলক ছিল কিনা তা নিয়ে আমি সংশয়ী ছিলাম - তবে আমি যাইহোক এটি চেষ্টা করেছি এবং এটি খুব সুন্দরভাবে কাজ করে। আমার কাছে একটি ইউআইটিএবলভিউসিলের মধ্যে একটি ইউআইআইমেজভিউ রয়েছে। আমি যা করেছি তা হ'ল ইউআইআইজেইভিউ ভিউকে একটি ডিলিএজভিউর সাথে প্রতিস্থাপন করা হয়েছিল, তারপরে চিত্রটি বলা হয়েছে ফ্রেমআরল: চিত্রটি লোড করার পদ্ধতি এবং এটি কেবলমাত্র কাজ করে - অ্যাসিঙ্ক্রোনাস লোডিং, ক্যাশিং ইত্যাদি সহজ কাজ হতে পারে না।
itnAAnti

DLImageLoader কল্পনাপ্রসূত অবশেষ অন্য ভাল এক, Haneke , যদিও এটি বেশ বজায় হচ্ছে না থেকে সামান্য ভুগছেন।
ফ্যাটি

উত্তর:


319

আপনি এটি এইভাবে করতে পারেন (একযোগে, কিন্তু কমপ্যাক্ট):

UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:MyURL]]];

ইন্টারঅ্যাক্টিভিটি সংরক্ষণের জন্য অ্যাপলের লাজিটেবল ইমেজগুলি ব্যবহার করা আরও অনেক ভাল পদ্ধতির।


1
পিএনজি (বা জেপিজি) ফাইল ফর্ম্যাট থেকে ইউআইআইমেজ ডেটাতে রূপান্তর করার দরকার নেই? অথবা ইউআইআইমেজটি কোনওভাবে এটি চিত্রিত করে?
প্রোগ্রামার

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

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

@ ড্যানিয়েল: আমি যে এনএসএসটিংয়ের পাশ দিয়ে যাচ্ছিলাম তার পরিবর্তে যদি আমি একটি স্ট্রিং ধ্রুবক ব্যবহার করি তবে এটি কাজ করে So ধন্যবাদ ড্যানিয়েল!
অগ্রগতি

যদি আপনি কেবল একটি চিত্র ব্যবহার করছেন এবং আপনি দ্রুত সমাধানের সন্ধান করছেন তবে আপনি কেবল একটি কোডটি লিখতে পারেন যা একক চিত্রকে ক্যাশে করে।
মিস্টার ডেটাবেস

27

আপনি SDWebImage চেষ্টা করতে পারেন , এটি সরবরাহ করে:

  1. অ্যাসিনক্রোনাস লোডিং
  2. অফলাইন ব্যবহারের জন্য ক্যাচিং
  3. স্থানের ধারক চিত্রটি লোড করার সময় প্রদর্শিত হবে
  4. ইউআইটিএবলভিউয়ের সাথে ভাল কাজ করে

দ্রুত উদাহরণ:

    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

2
আমি সেই লাইব্রেরিটিকে কিছুটা সংশোধন করেছি এবং এতে পুনরায় আকার / ক্রপ ক্ষমতা যুক্ত করার জন্য এটি ইউআইআইমেজ + রিসাইজের সাথে সংহত করেছি। আপনার যদি এটির প্রয়োজন হয় তবে এটি github.com/toptierlabs/ আইজ্যাজ ক্যাশে পুনরায় আকারে দেখুন
টনি

1
এই উদাহরণ একটি UIImageViewSDWebImageআপনাকে UIImageসরাসরি ব্যবহার করে পপুলেট করতে দেয় SDWebImageManager - (void) downloadWithURL:...। আমাকে পড়তে তাদের উদাহরণ দেখুন।
bendytree

10

এবং দ্রুত সংস্করণ:

   let url = NSURL.URLWithString("http://live-wallpaper.net/iphone/img/app/i/p/iphone-4s-wallpapers-mobile-backgrounds-dark_2466f886de3472ef1fa968033f1da3e1_raw_1087fae1932cec8837695934b7eb1250_raw.jpg");
    var err: NSError?
    var imageData :NSData = NSData.dataWithContentsOfURL(url,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
    var bgImage = UIImage(data:imageData)

7

আপনি যদি সত্যিই হন তবে পুরোপুরি ইতিবাচকভাবে নিশ্চিত যে এনএসআরএল একটি ফাইল ইউআরএল, অর্থাৎ [url isFileURL]আপনার ক্ষেত্রে সত্য প্রত্যাবর্তনের গ্যারান্টিযুক্ত, তবে আপনি সহজভাবে ব্যবহার করতে পারেন:

[UIImage imageWithContentsOfFile:url.path]

7

পেতে DLImageLoader এবং কোড folowing চেষ্টা

   [DLImageLoader loadImageFromURL:imageURL
                          completed:^(NSError *error, NSData *imgData) {
                              imageView.image = [UIImage imageWithData:imgData];
                              [imageView setContentMode:UIViewContentModeCenter];

                          }];

ডিআইএলজিজেড লোডার ব্যবহারের আরেকটি সাধারণ বাস্তব-বিশ্বের উদাহরণ, যা কারওর পক্ষে সহায়তা করতে পারে ...

PFObject *aFacebookUser = [self.fbFriends objectAtIndex:thisRow];
NSString *facebookImageURL = [NSString stringWithFormat:
    @"http://graph.facebook.com/%@/picture?type=large",
    [aFacebookUser objectForKey:@"id"] ];

__weak UIImageView *loadMe = self.userSmallAvatarImage;
// ~~note~~ you my, but usually DO NOT, want a weak ref
[DLImageLoader loadImageFromURL:facebookImageURL
   completed:^(NSError *error, NSData *imgData)
    {
    if ( loadMe == nil ) return;

    if (error == nil)
        {
        UIImage *image = [UIImage imageWithData:imgData];
        image = [image ourImageScaler];
        loadMe.image = image;
        }
    else
        {
        // an error when loading the image from the net
        }
    }];

এই দিনগুলিকে বিবেচনা করার জন্য আমি অন্য একটি দুর্দান্ত গ্রন্থাগারের উপরে উল্লেখ করেছি হানেক (দুর্ভাগ্যক্রমে এটি তেমন হালকা নয়)।


1
এসডিওয়েবআইমেজ হ'ল অবজেক্টিভ-সি-এর সর্বাধিক জনপ্রিয় লাইব্রেরি এবং কিংফিশার হ'ল সুইফট বন্দর।
এক্সওয়াই

1
সত্য, তবে ডি এলআইমেজলডার আরও ভাল! :)
ফ্যাটি

5

এই কোডটি ব্যবহার করে দেখুন, এটির সাহায্যে চিত্রটি লোড করা যায়, তাই ব্যবহারকারীরা জানেন যে আপনার অ্যাপ্লিকেশনটি ইউআরএল থেকে কোনও চিত্র লোড করছে:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"loading.png"]];
    [yourImageView setContentMode:UIViewContentModeScaleAspectFit];

    //Request image data from the URL:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://yourdomain.com/yourimg.png"]];

        dispatch_async(dispatch_get_main_queue(), ^{
            if (imgData)
            {
                //Load the data into an UIImage:
                UIImage *image = [UIImage imageWithData:imgData];

                //Check if your image loaded successfully:
                if (image)
                {
                    yourImageView.image = image;
                }
                else
                {
                    //Failed to load the data into an UIImage:
                    yourImageView.image = [UIImage imageNamed:@"no-data-image.png"];
                }
            }
            else
            {
                //Failed to get the image data:
                yourImageView.image = [UIImage imageNamed:@"no-data-image.png"];
            }
        });
    });

2
আমি এই সমাধানটিকে প্রাধান্য দিয়েছি কারণ এটির জন্য কোনও তৃতীয় পক্ষের ফ্রেমওয়ার্ক লোড করা বা ডেটা লোডিংয়ের সারিগুলি ইনস্ট্যান্টিয়েট করা ইত্যাদির প্রয়োজন নেই
বিলিআরাইক্রাস

4

পরীক্ষা করে দেখুন AsyncImageViewউপরে প্রদত্ত এখানে । কিছু ভাল উদাহরণ কোড, এবং এমনকি আপনার জন্য "বাক্সের বাইরে" ব্যবহারযোগ্য হতে পারে।


আকর্ষণীয় উদাহরণ, এটি পূর্বের উত্তরে উল্লিখিত অ্যাপলের লাজিটেবলআইমেজের উদাহরণের সাথে ধারণার তুলনায় অনেক একই।
অগ্রগতি

এটি অনুরূপ তবে সাবধান থাকুন যে অ্যাসিঙ্কআইমেজভিউ সত্যিই টেবিলগুলিতে কাজ করে না, কমপক্ষে আপনি যখন টেবিল কোষগুলি পুনর্ব্যবহার করেন না (যেমন আপনার উচিত)।
n13

4

এএফ নেটওয়ার্কিং স্থানধারক সমর্থন সহ একটি ইউআইআইমেজভিউতে অ্যাসিঙ্ক চিত্র লোডিং সরবরাহ করে। এটি সাধারণভাবে এপিআইয়ের সাথে কাজ করার জন্য অ্যাসিঙ্ক নেটওয়ার্কিং সমর্থন করে।


3

আইওএস 9 থেকে এই সেটিংস সক্ষম করার বিষয়টি নিশ্চিত করুন:

অ্যাপ পরিবহন নিরাপত্তা সেটিংস মধ্যে Info.plist URL থেকে চিত্র লোড নিশ্চিত করার যাতে এটি ডাউনলোড ইমেজ অনুমতি এবং এটি সেট হবে।

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

এবং এই কোডটি লিখুন:

NSURL *url = [[NSURL alloc]initWithString:@"http://feelgrafix.com/data/images/images-1.jpg"];
NSData *data =[NSData dataWithContentsOfURL:url];
quickViewImage.image = [UIImage imageWithData:data];

2

উপায় সুইফট ব্যবহার এক্সটেনশন করার জন্য UIImageView(সোর্স কোড এখানে ):

অ্যাসোসিয়েটেডের জন্য গণিত সম্পত্তি তৈরি করা UIActivityIndicatorView

import Foundation
import UIKit
import ObjectiveC

private var activityIndicatorAssociationKey: UInt8 = 0

extension UIImageView {
    //Associated Object as Computed Property
    var activityIndicator: UIActivityIndicatorView! {
        get {
            return objc_getAssociatedObject(self, &activityIndicatorAssociationKey) as? UIActivityIndicatorView
        }
        set(newValue) {
            objc_setAssociatedObject(self, &activityIndicatorAssociationKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }

    private func ensureActivityIndicatorIsAnimating() {
        if (self.activityIndicator == nil) {
            self.activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
            self.activityIndicator.hidesWhenStopped = true
            let size = self.frame.size;
            self.activityIndicator.center = CGPoint(x: size.width/2, y: size.height/2);
            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                self.addSubview(self.activityIndicator)
                self.activityIndicator.startAnimating()
            })
        }
    }

কাস্টম ইনিশিয়ালাইজার এবং সেটার

    convenience init(URL: NSURL, errorImage: UIImage? = nil) {
        self.init()
        self.setImageFromURL(URL)
    }

    func setImageFromURL(URL: NSURL, errorImage: UIImage? = nil) {
        self.ensureActivityIndicatorIsAnimating()
        let downloadTask = NSURLSession.sharedSession().dataTaskWithURL(URL) {(data, response, error) in
            if (error == nil) {
                NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                    self.activityIndicator.stopAnimating()
                    self.image = UIImage(data: data)
                })
            }
            else {
                self.image = errorImage
            }
        }
        downloadTask.resume()
    }
}

0

Url এর মাধ্যমে চিত্র লোড করার সর্বোত্তম এবং সহজ উপায় হ'ল এই কোডটি দ্বারা:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]];

    dispatch_async(dispatch_get_main_queue(), ^{
        imgView.image= [UIImage imageWithData:data];
    });
});

প্রতিস্থাপন imgUrlআপনার দ্বারা ImageURL
প্রতিস্থাপন imgViewআপনার দ্বারা UIImageView

এটি অন্য থ্রেডে চিত্রটি লোড করবে, সুতরাং এটি আপনার অ্যাপ্লিকেশন লোডকে কমিয়ে দেবে না।

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