কীভাবে কোনও ইউআইভিউকে কোনও চিত্রে রূপান্তর করতে হয়


99

আমি একটি ইউআইভিউউকে কোনও চিত্রে রূপান্তর করতে এবং এটি আমার অ্যাপ্লিকেশনটিতে সংরক্ষণ করতে চাই। কেউ দয়া করে আমাকে কীভাবে কোনও দৃশ্যের স্ক্রিনশট নেবেন বা একটি চিত্রে রূপান্তর করবেন এবং কোনও অ্যাপে (ক্যামেরা রোল নয়) এটিকে সংরক্ষণ করার সর্বোত্তম উপায় কী? দেখার জন্য কোডটি এখানে:

var overView   = UIView(frame: CGRectMake(0, 0, self.view.frame.width/1.3, self.view.frame.height/1.3))
overView.center = CGPointMake(CGRectGetMidX(self.view.bounds),
CGRectGetMidY(self.view.bounds)-self.view.frame.height/16);
overView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(overView)
self.view.bringSubviewToFront(overView)

এছাড়াও প্রাসঙ্গিক: stackoverflow.com/q/59592933/294884
ফ্যাটি

উত্তর:


199

এর উপর একটি এক্সটেনশানটি UIViewকৌশলটি করা উচিত।

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

অ্যাপল আই 3 UIGraphicsBeginImageContext10 শুরু করে পি 3 রঙের গামুট প্রবর্তন করে নিরুৎসাহিত করে । UIGraphicsBeginImageContextশুধুমাত্র এসআরজিবি এবং কেবল 32-বিট। তারা UIGraphicsImageRendererসম্পূর্ণরূপে রঙিন পরিচালিত, ব্লক-ভিত্তিক, পিডিএফ এবং চিত্রগুলির জন্য সাবক্লাস রয়েছে এবং স্বয়ংক্রিয়ভাবে প্রসঙ্গের আজীবন পরিচালনা করে API আরও বিশদ জানতে ডাব্লুডব্লিউডিসি 16 অধিবেশন 205 দেখুন (চিত্রের রেন্ডারিং 11:50 চিহ্নের কাছাকাছি শুরু হয়)

এটি প্রতিটি ডিভাইসে কাজ করে তা নিশ্চিত হতে #available, iOS এর পূর্ববর্তী সংস্করণগুলির ফালব্যাক সহ ব্যবহার করুন :

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContext(self.frame.size)
            self.layer.render(in:UIGraphicsGetCurrentContext()!)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return UIImage(cgImage: image!.cgImage!)
        }
    }
}

9
এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত। অন্যান্য সমস্ত বিকল্পের ফলে রেন্ডার করা চিত্রটি স্বচ্ছতা হারাবে এবং পিক্সেলিটেড / অস্পষ্ট দেখাবে।
TuplingD

একমাত্র সঠিক উপায়! নতুনদের জন্য ব্যবহারটি হ'ল চিত্রটি = কাস্টমভিউ.আসমেজ ()
ফ্যাবিও

4
স্বচ্ছ পটভূমি সহ ইউআইভিউ রেন্ডার করা কি সম্ভব? খনিতে কিছু গোলাকার কোণ রয়েছে।
ixany

@ মিক্সনি এটি ইতিমধ্যে এটি যত্ন নেওয়া উচিত। আমি শুধু একটি খেলার মাঠে অনুসরণ করে এটিকে চেষ্টা এবং এটা কাজ করে: let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)); view.backgroundColor = .black; view.layer.cornerRadius = 9; view.asImage();
নাভিদ জে

4
ধন্যবাদ! যদি কারও জানা থাকে তবে হ্যাকিংউইথসইউইফট.ইউ.কম্পল- কোড / মিডিয়া /… থেকে কোডের সাথে কী পার্থক্য রয়েছে তা জানতে আগ্রহী হব : রিটার্ন রেডিয়ার.আইমিজ {সিটিএক্স অঙ্কন হায়ারার্কিতে (ইন: সীমানা, পরবর্তীতে স্ক্রিনআপটেটস: সত্য)}
Kqtr

64

আপনি এক্সটেনশন ব্যবহার করতে পারেন

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in:UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: image!.cgImage!)
    }
}

এখানে সুইফ্ট 3/4 সংস্করণ:

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in:UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: image!.cgImage!)
    }
}

4
আমি এটি জিজ্ঞাসা করা হতে পেরে বিব্রত বোধ করছি, তবে আমি কীভাবে এটিকে ডাকব? আমার কোনও চিত্র এবং ইউআইভিউ নেই যা আমি চিত্র হতে চাই। উপরের কোডটি আমাকে একটি ইউআইআইমেজ এক্সটেনশন দেয় ... তবে এখন কী?
ডেভ জি

8
let image = UIImage(view: myView)
ডক্টর ব্র্যাক্টর 11:48

ইউআইজিগ্রাফিকস গেটকভারেন্টকন্টেক্সট () শূন্য হতে পারে এবং কোড ক্র্যাশ হতে পারে বলে আমার পক্ষে কাজ করে না।
হুয়ান কার্লোস অস্পিনা গঞ্জালেজ

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

4
আপনার স্ক্রিনের UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
স্কেলটিও মাথায়

41

আপনার ইউআইভিউ চিত্রকে চিত্রের মাধ্যমে রূপান্তর করুন চিত্রটি হায়ারচিআইআইএনআরেক্ট: আফটারস্ক্রিনআপটেটস: যা রেন্ডারআইএনটেক্সটেক্সের চেয়ে বহুগুণ দ্রুত

গুরুত্বপূর্ণ দ্রষ্টব্য: ভিউডিডলড বা ভিউউইল অ্যাপ্লিকেশন থেকে এই ফাংশনটি কল করবেন না , নিশ্চিত হয়ে নিন যে আপনি কোনও দৃশ্য প্রদর্শিত হওয়ার পরে / পুরোপুরি লোড হওয়ার পরে এটি ক্যাপচার করছেন make

ওবজ সি

     UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.opaque, 0.0f);
     [myView drawViewHierarchyInRect:myView.bounds afterScreenUpdates:NO];
     UIImage *snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

     myImageView.image =  snapshotImageFromMyView;

সম্পাদিত চিত্র ফটো অ্যালবাম সংরক্ষণ করুন

     UIImageWriteToSavedPhotosAlbum(snapshotImageFromMyView, nil,nil, nil);

সুইফট 3/4

    UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.isOpaque, 0.0)
    myView.drawHierarchy(in: myView.bounds, afterScreenUpdates: false)
    let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    print(snapshotImageFromMyView)
    myImageView.image = snapshotImageFromMyView

এক্সটেনশন, আইওএস 11, সুইফট 3/4 এর সাথে দুর্দান্ত সহজ সাধারণীকরণ

extension UIImage{
    convenience init(view: UIView) {

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    self.init(cgImage: (image?.cgImage)!)

  }
}


Use : 
 //myView is completly loaded/visible , calling this code after only after viewDidAppear is call
 imgVV.image = UIImage.init(view: myView)
 // Simple image object
 let img =  UIImage.init(view: myView)

4
আমার জন্য কাজ করছে না আমি আমার ইউআইজিএজ
বদর

সত্যি ?? আপনি কি এখানে আপনার কোড পেস্ট করতে পারেন .. আপনি ইউআইআইজেজ রূপান্তর করতে ভুল ইউআইভিউ অবজেক্টটি ব্যবহার করছেন।
বিজয় আওহাদ

`ফানক রূপান্তর ভিউআইন্টিআইএমজি () -> শূন্য {imgFakeCard.image = UIImage.init (দেখুন: কার্ড)` sw আপনার 3 এক্সটেনশনের সাথে সুইফট 3 এ ফাংশনটি ভিউডিডলয়েডে বলা হয়েছে
বদর

4
আপনার কোড পোস্ট করার জন্য এবং আপনাকে ভিডডিডোডে ডেকে পাঠানোর জন্য ধন্যবাদ। এখানে আপনি কী ভুল করেছেন। মেমরিতে লোড হওয়ার আগে আপনি কোনও স্ন্যাপশট ক্যাপচার করছেন। দয়া করে ভিউডিড অ্যাপায়ারে কল করার চেষ্টা করুন, এটি অবশ্যই সমস্যার সমাধান করবে। কোন প্রশ্ন দয়া করে উত্তর দিন।
বিজয় আওহাদ

ধন্যবাদ এই কাজের ধন্যবাদ, সমস্যাটি সেখান থেকে এসেছিল যেখানে আমি আপনার এক্সটেনশানটি বলেছিলাম
বদর ফিলালী

20

আইওএস 10 এ:

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)
    }
}

4
এটি ক্র্যাশ বাড়ে।
কিংপলিগন

18

আইওএস 10 এবং সুইফট 3 হিসাবে সেরা অনুশীলন

এখনও আইওএস 9 সমর্থন করে এবং এরপরে এখনও আইওএস 13, এক্সকোড 11.1, সুইফট 5.1 হিসাবে কাজ করে

extension UIView {

    func asImage() -> UIImage? {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
            defer { UIGraphicsEndImageContext() }
            guard let currentContext = UIGraphicsGetCurrentContext() else {
                return nil
            }
            self.layer.render(in: currentContext)
            return UIGraphicsGetImageFromCurrentImageContext()
        }
    }
}

আমি নিশ্চিত না যে প্রশ্নটির অর্থ কী:

কোনও অ্যাপে এটি সংরক্ষণের সর্বোত্তম উপায় কী (ক্যামেরা রোল নয়)?


17
    UIGraphicsBeginImageContext(self.view.bounds.size);        
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext())
    var screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


4
ইউআইজিগ্রাফিকস গেট আইমেজ ফ্রেম কর্নার আইজ্যাজ কনটেক্সট ইউআইআইমেজকে ফিরিয়ে দেয়। এটি ইউআইআইজেমে কাস্ট করার দরকার নেই
লিও ডাবাস

এটি পুরো দৃশ্যের স্ক্রিনশটটি হ্যাঁ? আমি কেবল আমার কোডে একটি ইউআইভিউ অর্থাত্ ওভারভিউ রূপান্তর করতে চাই যা স্ব-দর্শনরূপের চিত্রকে একটি চিত্রে রূপান্তর করতে পারে। পুরো ভিউ না!
সমীর হুসেন

@ ভাকাস যখন আমি চিত্রটি মুদ্রণ করার চেষ্টা করেছি।এর প্রদর্শনটি খুব ছোট small এর সমাধান কী
ক্রুতার্থ প্যাটেল

6
স্ক্রিনশট চিত্রটি ভাল মানের নয়, আমি কী করব?
নীলা

13

উদাহরণস্বরূপ, যদি আমার আকারের ভিউ থাকে: 100% তে 50 ডলার 50 স্ক্রিনশট নেওয়ার জন্য আমি নিম্নলিখিতটি ব্যবহার করতে পারি:

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), false, 0);
    self.view.drawViewHierarchyInRect(CGRectMake(-50,-5-,view.bounds.size.width,view.bounds.size.height), afterScreenUpdates: true)
    var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();

সেলফ.ভিউ লাইনে প্যারামিটারে ভুল রয়েছে i আমি মনে করি এটি -5 -5- হওয়া উচিত নয়
ক্রুতার্থ প্যাটেল

@ সমীর আমার একটি প্রশ্ন আছে। আমি যখন এই চিত্রটি প্রিন্ট করি তখন এটি খুব ছোট
ক্রুতার্থ প্যাটেল

7

আমার মতে, ইনিশিয়ালাইজারের সাথে যোগাযোগটি দুর্দান্ত নয় কারণ এটি দুটি চিত্র তৈরি করে।

আমি এটি পছন্দ করি:

extension UIView {
    var snapshot: UIImage? {
        UIGraphicsBeginImageContext(self.frame.size)
        guard let context = UIGraphicsGetCurrentContext() else {
            return nil
        }
        layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

আপনার সম্পত্তিটি চিত্র ব্যতীত অন্য কিছু বলা উচিত। এটি উপ-শ্রেণীর সাথে হস্তক্ষেপ করতে পারে যা ইউআইআইমেজভিউয়ের মতো চিত্র হিসাবে পরিচিতি রয়েছে।
হবিস দ্য টাইগ

@ হবিস্টেটিগের পরামর্শ অনুসরণ করে সম্পত্তিটির নতুন নামকরণ করেছেন
টিনো

6

সুইফট 4.2, আইওএস 10

extension UIView {

    // If Swift version is lower than 4.2, 
    // You should change the name. (ex. var renderedImage: UIImage?)

    var image: UIImage? {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in layer.render(in: rendererContext.cgContext) }
    }
}

নমুনা

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = .blue

let view2 = UIView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))
view2.backgroundColor = .red
view.addSubview(view2)

let imageView = UIImageView(image: view.image)

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


কেবলমাত্র এটি উল্লেখ করতে চেয়েছিলেন যে আপনি যদি আপনার প্রকল্পে কোনও ইউআইআইমেজভিউগুলি ব্যবহার করেন তবে অন্য কোনও চিত্রের নামকরণ করা দরকার। চিত্রটি কেবলমাত্র পঠিত হয়ে যায়। হয়ত এটিকে 'চিত্র' এর পরিবর্তে 'স্ক্রিনক্যাপচার' বলুন।
ক্রিস

@ ক্রিস হ্যাঁ, আপনি ঠিক বলেছেন। যদি একটি নাম পরিবর্তন করতে হবে যদি সুইফ্ট সংস্করণটি 4.2 এর চেয়ে কম থাকে। আপনার ভুলটি নির্দেশ করার জন্য ধন্যবাদ
ডেন

6

এটি আমার জন্য এক্সকোড 9 / সুইফট 3.2 / সুইফট 4 এবং এক্সকোড 8 / সুইফ্ট 3 এর জন্য কাজ করে

 if #available(iOS 10.0, *) {

     // for Xcode 9/Swift 3.2/Swift 4 -Paul Hudson's code
     let renderer = UIGraphicsImageRenderer(size: view!.bounds.size)
     let capturedImage = renderer.image { 
         (ctx) in
         view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
     }
     return capturedImage

 } else {

     // for Xcode 8/Swift 3
     UIGraphicsBeginImageContextWithOptions((view!.bounds.size), view!.isOpaque, 0.0)
     view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: false)
     let capturedImage = UIGraphicsGetImageFromCurrentImageContext()
     UIGraphicsEndImageContext()
     return capturedImage!
 }

এটি কোনও ফাংশনের অভ্যন্তরে কীভাবে ব্যবহার করবেন তা এখানে:

fileprivate func captureUIImageFromUIView(_ view:UIView?) -> UIImage {

     guard (view != nil) else{

        // if the view is nil (it's happened to me) return an alternative image
        let errorImage = UIImage(named: "Error Image")
        return errorImage
     }

     // if the view is all good then convert the image inside the view to a uiimage
     if #available(iOS 10.0, *) {

         let renderer = UIGraphicsImageRenderer(size: view!.bounds.size)
         let capturedImage = renderer.image { 
             (ctx) in
             view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
         }
         return capturedImage

     } else {

         UIGraphicsBeginImageContextWithOptions((view!.bounds.size), view!.isOpaque, 0.0)
         view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: false)
         let capturedImage = UIGraphicsGetImageFromCurrentImageContext()
         UIGraphicsEndImageContext()
         return capturedImage!
     }
}

চিত্রটি ফাংশন থেকে ফিরে কীভাবে কিছু করবেন তা এখানে রয়েছে:

@IBOutlet weak fileprivate var myCustomView: UIView!
var myPic: UIImage?

let myImageView = UIImageView()

@IBAction fileprivate func saveImageButtonTapped(_ sender: UIButton) {

   myPic = captureUIImageFromUIView(myCustomView)

   // display the pic inside a UIImageView
   myImageView.image = myPic!
}

আমি পল হাডসনের কাছ থেকে এক্সকোড 9 / সুইফট 3.2 / সুইফ্ট 4 উত্তর পেয়েছি এক্সকোড ইউভিউকে ইউআইমেজে রূপান্তর করি

আমি দীর্ঘ সময় আগে এসও থেকে কোথাও থেকে এক্সকোড 8 / সুইফট 3 পেয়েছি এবং আমি কোথায় ভুলে গিয়েছি :(


এছাড়াও চিত্রটি কোথায় প্রদর্শিত হবে এবং / বা সেভ হবে?
ফ্যামিক টেক

@ ফ্যামিকটেক একবার ছবিটি তৈরি হয়ে গেলে এটি যুবকদের উপর নির্ভর করে এটি দিয়ে কী করবেন। আমার কোড থেকে উদাহরণ হিসাবে আমি সবেমাত্র ইউআইভিউউকে "মাইপিক" নামের একটি ইউআইআইমেজে রূপান্তর করেছি তবে আমি 'মাইপিক' দিয়ে কিছুই করি নি। পরবর্তী সম্ভাব্য পদক্ষেপটি হ'ল মাইপিকটি কোনও ইউআইআইভিএভিজেইউর ভিতরে এইভাবে প্রদর্শিত হয়: মাই আইজেমভিউইউইম = মাইপিক। আপনি যদি কোনও কালেকশনভিউ ব্যবহার করছেন এবং আপনি এতে চিত্রগুলি প্রদর্শন করতে চান তবে আপনি প্রতিটি ঘরে একটি ইউআইআইমেজভিউ তৈরি করুন এবং তারপরে ইউটিআইভিজভিউয়ের মধ্যে চিত্রটি (মাইপিক) ডেটাসোর্স প্রাক্তন থেকে সূচীপথ.ইটিএম এর মাধ্যমে প্রদর্শন করুন: myImageView.image = ডাটাসোর্স [সূচকপথ] .item] .myPic
ল্যান্স সামেরিয়া

@ ফ্যামিকটেক আপনি কিছুটা ভুল করছেন। সংগ্রহশালাটির সাথে এর কোনও যোগসূত্র নেই। আপনার কাছে 2 টি পৃথক শ্রেণীর প্রকার রয়েছে: ইউআইআইমেজ এবং একটি ইউআইভিউ। উভয়ই যেকোন চিত্র প্রদর্শন করতে ব্যবহৃত হতে পারে তবে তারা উভয়ই এটি বিভিন্ন উপায়ে করে। আইওএসের খুব সুন্দর সবকিছুই একটি ইউআইভিউর একটি সাবক্লাস তবে একটি ইউআইআইমেজ কেবল চিত্রগুলি প্রদর্শন করতে পারে (2 ভিন্ন জিনিস)। এই ফাংশনটি যা করে তা হ'ল ইউআইভিআইউ নেওয়া এবং এটি একটি ইউআইআইমেজে রূপান্তরিত করে। একটি সহজ উদাহরণ। আপনি যদি 4.0 (একটি ডাবল) 4 এ রূপান্তর করতে চান তবে আপনি এটি (INT) 4.0 নিক্ষেপ করেছেন ফলাফল 4 তবে এটির সাহায্যে আপনি ইউআইআইভিউ-র ভিতরে চিত্রটি একটি ইউআইআইমেজে রূপান্তর করুন। বোঝা?
ল্যান্স সামেরিয়া

আমি যা করার চেষ্টা করছি তা হল ব্যবহারকারী আমার সংগ্রহ ভিউ কন্ট্রোলারে আসুন এবং একটি বোতাম টিপুন যা বর্তমান ভিউটি গ্রহণ করবে, যা কালেকশন ভিউ 10x10 বলে মনে হয় এবং পুরো 10x10 গ্রিডের চিত্র তৈরি করে (দয়া করে নোট করুন যে সম্পূর্ণটি গ্রিড সম্পূর্ণরূপে দৃশ্যমান নয়)। উপরের আপনার কোডগুলি কি ব্যবহারের ক্ষেত্রে সমাধান করে?
ফ্যামিক টেক

বোতামটি নেভিগেশন কন্ট্রোলারে রয়েছে। ব্যবহারকারী এটিতে ক্লিক করবেন এবং এটি 'নেভিগেশন কন্ট্রোলারের অধীনে প্রদর্শিত কালেকশন ভিউটি গ্রহণ করুন এবং সংগ্রহের ভিউতে থাকা সেলগুলিতে থাকা সমস্ত তথ্য সহ সংগ্রহ ভিউয়ের একটি চিত্র তৈরি করুন (একটি পিডিএফও কাজ করবে)।
ফ্যামিক টেক

5
var snapshot = overView.snapshotViewAfterScreenUpdates(false)

বা উদ্দেশ্য-গ

UIView* snapshot = [overView snapshotViewAfterScreenUpdates:NO];

চিত্রটি কি চিত্রের মতোই? যদি তা হয় তবে আমি কীভাবে এটি আমার অ্যাপে সংরক্ষণ করব?
সমীর হুসেন

4

আপনি এটির মতো এক্সটেনশন ব্যবহার করে এটি সহজেই ব্যবহার করতে পারেন

// Take a snapshot from a view (just one view)
let viewSnapshot = myView.snapshot

// Take a screenshot (with every views in screen)
let screenSnapshot = UIApplication.shared.snapshot

// Take a snapshot from UIImage initialization
UIImage(view: self.view)

আপনি যদি সেই এক্সটেনশন পদ্ধতি / ভেরিয়েবলগুলি ব্যবহার করতে চান তবে এটি প্রয়োগ করুন

  1. ইউআইআইমেজ এক্সটেনশন

    extension UIImage {
        convenience init(view: UIView) {
            if let cgImage = view.snapshot?.cgImage {
                self.init(cgImage: cgImage)
            } else {
                self.init()
            }
        }
    }
    
  2. ইউআইভিউ এক্সটেনশন

    extension UIView {
    
        var snapshot: UIImage? {
            UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0)
            if UIGraphicsGetCurrentContext() != nil {
                drawHierarchy(in: bounds, afterScreenUpdates: true)
                let screenshot = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
                return screenshot
            }
            return nil
        }
    }
    
  3. ইউআইএপ্লিকেশন এক্সটেনশন

    extension UIApplication {
    
        var snapshot: UIImage? {
            return keyWindow?.rootViewController?.view.snapshot
        }
    }
    

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

3

অথবা আইওএস 10+ আপনি নতুন ইউআইজিগ্রাফিকস ইমেজ রেন্ডারার + প্রস্তাবিত অঙ্কনহিরারচি ব্যবহার করতে পারেন, যা কিছু পরিস্থিতিতে লেয়ার.রেেন্ডারআইনেক্সটেক্সট থেকে অনেক দ্রুততর হতে পারে

extension UIView {
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
        return renderer.image { _ in
            self.drawHierarchy(in: CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height), afterScreenUpdates: false)
        }
    }
}

3

ধন্যবাদ @ বাও তুয়ান ডায়াপ! আমি একটি পরিপূরক যোগ করতে চান

আপনি যখন কোডটি ব্যবহার করবেন:

yourView.layer.render(in:UIGraphicsGetCurrentContext()!)

আপনার অবশ্যই এটি লক্ষ্য করা উচিত:

 - If you had used `autoLayout` or `Masonry` in `yourView` (that you want to convert) .
 - If you did not add `yourView` to another view which means that `yourView` was not used as a subview but just an object.

তারপরে, আপনার অবশ্যই ব্যবহার করতে হবে :

[yourView setNeedsLayout];
[yourView layoutIfNeeded];

yourViewআগে আপডেট করতে yourView.layer.render(in:UIGraphicsGetCurrentContext()!)

অন্যথায় আপনি এমন একটি চিত্র বস্তু পেতে পারেন যাতে কোনও উপাদান নেই


এর জন্য ধন্যবাদ. অনেক সাহায্য করেছে !!
মাকসিম নিয়াজেভ

2

সুইফট 4.2

import Foundation
import UIKit  

extension UIImage {

    convenience init(view: UIView) {

        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)

    } 
}

ব্যবহার:

চলুন img = UIImage.init (দেখুন: স্ব.হোল্ডারভিউ)


1

সুইফ্ট 3 এ বাস্তবায়ন :

ক্লাসের সুযোগ ছাড়াই নীচের কোডটি যুক্ত করুন।

extension UIImage {
    convenience init(_ view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)
    }
}

ব্যবহার:

let image = UIImage( Your_View_Outlet )

ত্রুটি পেয়েছে "একটি ভিউ আঁকতে (0x1040a6970, ইউআইভিউ) যা কমপক্ষে একবার রেন্ডার করা হয়নি"
কিশু মেওয়ারা

0

আমি @ নাভিদ জে বাস্তবায়ন করেছি এর পদ্ধতিটি এবং এটি একটি মতো কাজ করেছে।

এখানে তাঁর প্ররোচনা:

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

এখানে আমি এটি বাস্তবায়ন করেছি।

//create an image from yourView to display
//determine the frame of the view/imageimage
let screen = self.superview!.bounds
let width = screen.width / 4 //make image 1/4 width of screen
let height = width
let frame = CGRect(x: 0, y: 0, width: width, height: height)
let x = (screen.size.width - frame.size.width) * 0.5
let y = (screen.size.height - frame.size.height) * 0.5
let mainFrame = CGRect(x: x, y: y, width: frame.size.width, height: frame.size.height)

let yourView = YourView() //instantiate yourView
yourView.frame = mainFrame //give it the frame
yourView.setNeedsDisplay() //tell it to display (I am not 100% sure this is needed)

let characterViewImage = yourView.asImage()

0

আইওএস 10 সাল থেকে উপলব্ধ নতুন ইউআইজিগ্রাফিকস ইমেজরেন্ডারারের সাথে ইনিশিয়ালাইজার:

extension UIImage{
    convenience init(view: UIView) {

    let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
    let canvas = CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height)
    let image = renderer.image { _ in
        self.drawHierarchy(in: canvas, afterScreenUpdates: false)
    }
    self.init(cgImage: (image?.cgImage)!)
  }
}

0

আমার সাথে ভাল কাজ!

সুইফট 4

 extension UIView {

    func toImage() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
        self.drawHierarchy(in: self.bounds, afterScreenUpdates: false)
        let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapshotImageFromMyView!
    }

    }

return snapshotImageFromMyView!থ্রেড 1: মারাত্মক ত্রুটি: একটি
ptionচ্ছিক

0

দেখার জন্য অস্পষ্ট সাবভিউ রয়েছে (যেমন ইউআইভিউজুয়ালএফেক্টভিউ উদাহরণস্বরূপ), কেবল ড্রইউ ভিউ হায়ারচি আইট্র্যাক্ট: আফটারস্ক্রিনআপটেটস কাজ করে।

এই মামলার জন্য @ ভাইজে আওহাদের উত্তর সঠিক।


0

ইউআইজিগ্রাফিকসআইমেজেন্ডেন্ডার ব্যবহার করে কাজ করা হয় না যখন ভিউতে দৃশ্য কিট সাবভিউ, ধাতু বা স্প্রাইট কিট থাকে। এই ক্ষেত্রে, ব্যবহার করুন

let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { ctx in
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}

-1
please try below code.
-(UIImage *)getMainImageFromContext
{
UIGraphicsBeginImageContextWithOptions(viewBG.bounds.size, viewBG.opaque, 0.0);
[viewBG.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.