ios - কিভাবে প্রোগ্রাম্যাটিকভাবে একটি স্ক্রিনশট নিতে




iphone screenshot (14)

আমি স্ক্রিনে ছবির স্ক্রিনশট সংরক্ষিত ফটো লাইব্রেরিতে সংরক্ষণ করতে চাই


Bellow সাইটে পাওয়া দুটি বিকল্প:

বিকল্প 1: UIWindow ব্যবহার করে (চেষ্টা এবং পুরোপুরি কাজ)

// create graphics context with screen size
CGRect screenRect = [[UIScreen mainScreen] bounds];
UIGraphicsBeginImageContext(screenRect.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor blackColor] set];
CGContextFillRect(ctx, screenRect);

// grab reference to our window
UIWindow *window = [UIApplication sharedApplication].keyWindow;

// transfer content into our context
[window.layer renderInContext:ctx];
UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

বিকল্প 2: UIView ব্যবহার করে

// grab reference to the view you'd like to capture
UIView *wholeScreen = self.splitViewController.view;

// define the size and grab a UIImage from it
UIGraphicsBeginImageContextWithOptions(wholeScreen.bounds.size, wholeScreen.opaque, 0.0);
[wholeScreen.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

রেটিনা পর্দা (DenNukem উত্তর হিসাবে)

// grab reference to our window
    UIWindow *window = [UIApplication sharedApplication].keyWindow;

    // create graphics context with screen size
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        UIGraphicsBeginImageContextWithOptions(screenRect.size, NO, [UIScreen mainScreen].scale);
    } else {
        UIGraphicsBeginImageContext(screenRect.size);
        [window.layer renderInContext:UIGraphicsGetCurrentContext()];
    }

আরো বিস্তারিত জানার জন্য: http://pinkstone.co.uk/how-to-take-a-screeshot-in-ios-programmatically/


IOS10 হিসাবে, এটি একটি বিট সহজ পায়। UIKit UIGraphicsImageRender এর সাথে আসে যা আপনাকে করতে দেয়

... রঙ গভীরতা এবং চিত্র স্কেল হিসাবে কনফিগারেশন হ্যান্ডেল, বা কোর গ্রাফিক্স প্রসঙ্গ পরিচালনা না করে অঙ্কন কাজ সম্পাদন

অ্যাপল ডক্স - UIGraphics চিত্র উপস্থাপক

সুতরাং আপনি এখন এই মত কিছু করতে পারেন:

let renderer = UIGraphicsImageRenderer(size: someView.bounds.size)

let image = renderer.image(actions: { context in
    someView.drawHierarchy(in: someView.bounds, afterScreenUpdates: true)
})

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


আইওএস 7.0 বা এর উপরে

আপনি যদি স্ক্রিনশট ভিউ নিতে চান (myView), আপনি একক লাইন দিয়ে এটি করতে পারেন:

[myView snapshotViewAfterScreenUpdates:NO];

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

Disclaimer এটি আমার কোড নয়, আমার উত্তর নয়, এটি শুধুমাত্র এমন লোকদের সাহায্য করার জন্য যা এখানে দ্রুত উত্তর খুঁজে পায়। ক্রেডিট দেওয়ার কারণে ক্রেডিট দিতে আসল উত্তরগুলির লিঙ্ক আছে !! যদি আপনি তাদের উত্তর ব্যবহার করেন, তাহলে +1 দিয়ে এই সম্মান করুন!

QuartzCore ব্যবহার করে

#import <QuartzCore/QuartzCore.h> 

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale);
} else {
    UIGraphicsBeginImageContext(self.window.bounds.size);
}

[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image);
if (imageData) {
    [imageData writeToFile:@"screenshot.png" atomically:YES];
} else {
    NSLog(@"error while taking screenshot");
}

সুইফ্ট ইন

func captureScreen() -> UIImage
{

    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, false, 0);

    self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)

    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return image
}

দ্রষ্টব্য: প্রোগ্রামিং সহ প্রকৃতির হিসাবে, আপডেটগুলি সম্পন্ন করতে হবে তাই দয়া করে সম্পাদনা করুন বা আমাকে জানান! * এছাড়াও যদি আমি একটি উত্তর / পদ্ধতি মূল্য অন্তর্ভুক্ত করতে ব্যর্থ হয়েছে সহকারে আমাকে জানাতে বিনা দ্বিধায়!


আমি সুইফট 3 বাস্তবায়ন সঙ্গে একটি উত্তর খুঁজে পেতে পারে নি। তাই এখানে এটা যায়।

static func screenshotOf(window: UIWindow) -> UIImage? {

    UIGraphicsBeginImageContextWithOptions(window.bounds.size, true, UIScreen.main.scale)

    guard let currentContext = UIGraphicsGetCurrentContext() else {
        return nil
    }

    window.layer.render(in: currentContext)
    guard let image = UIGraphicsGetImageFromCurrentImageContext() else {
        UIGraphicsEndImageContext()
        return nil
    }

    UIGraphicsEndImageContext()
    return image
}

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

var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
var picker = window.pickers()[0];
var wheel = picker.wheels()[2];
var buttons = window.buttons();
var button1 = buttons.firstWithPredicate("name == 'dateButton1'");
var button2 = buttons.firstWithPredicate("name == 'dateButton2'");

function setYear(picker, year) {
    var yearName = year.toString();
    var yearWheel = picker.wheels()[2];
    yearWheel.selectValue(yearName);
}

function setMonth(picker, monthName) {
    var wheel = picker.wheels()[0];
    wheel.selectValue(monthName);
}

function setDay(picker, day) {
    var wheel = picker.wheels()[1];
    var name = day.toString();
    wheel.selectValue(name);
}

target.delay(1);
setYear(picker, 2015);
setMonth(picker, "July");
setDay(picker, 4);
button1.tap();
setYear(picker, 2015);
setMonth(picker, "December");
setDay(picker, 25);

target.captureScreenWithName("daysShot1");

var nButtons = buttons.length;
UIALogger.logMessage(nButtons + " buttons");
for (var i=0; i<nButtons; i++) {
    UIALogger.logMessage("button " + buttons[i].name());
}

var tabBar = window.tabBars()[0];
var barButtons = tabBar.buttons();

var nBarButtons = barButtons.length;
UIALogger.logMessage(nBarButtons + " buttons on tab bar");

for (var i=0; i<nBarButtons; i++) {
    UIALogger.logMessage("button " + barButtons[i].name());
}

var weeksButton = barButtons[1];
var monthsButton = barButtons[2];
var yearsButton = barButtons[3];

target.delay(2);
weeksButton.tap();
target.captureScreenWithName("daysShot2");
target.delay(2);
monthsButton.tap();
target.captureScreenWithName("daysShot3");
target.delay(2);
yearsButton.tap();
target.delay(2);
button2.tap();
target.delay(2);
setYear(picker, 2018);
target.delay(2);
target.captureScreenWithName("daysShot4");

এটি একটি স্ক্রিনশট সংরক্ষণ করবে এবং সেইসাথে স্ক্রিনশটটিও ফেরত দেবে।

-(UIImage *)capture{
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *imageView = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageWriteToSavedPhotosAlbum(imageView, nil, nil, nil); //if you need to save
    return imageView;
}

দেখুন থেকে স্ক্রিনশট পান:

- (UIImage *)takeSnapshotView {
    CGRect rect = [myView bounds];//Here you can change your view with myView
    UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [myView.layer renderInContext:context];
    UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return capturedScreen;//capturedScreen is the image of your view
}

আশা করি, এই আপনি খুঁজছেন হয়। কোন উদ্বেগ আমার ফিরে পেতে। :)


শুধু একটি ছোট অবদান, আমি একটি বোতাম দিয়ে এটি করেছি কিন্তু চাপ এছাড়াও বাটন চাপানো হয় মানে। তাই প্রথম আমি unhighlight।

- (IBAction)screenShot:(id)sender {
    // Unpress screen shot button
    screenShotButton.highlighted = NO;

    // create graphics context with screen size
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);
    } else {
        UIGraphicsBeginImageContext(self.view.bounds.size);
    }

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];
    CGContextFillRect(ctx, screenRect);

    // grab reference to our window
    UIWindow *window = [UIApplication sharedApplication].keyWindow;

    // transfer content into our context
    [window.layer renderInContext:ctx];
    UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // save screengrab to Camera Roll
    UIImageWriteToSavedPhotosAlbum(screengrab, nil, nil, nil);
}

আমি কোডটির মূল অংশটি পেয়েছি: http://pinkstone.co.uk/how-to-take-a-screeshot-in-ios-programmatically/ যেখানে আমি বিকল্প 1 ব্যবহার করেছিলাম, বিকল্প 2 কাজ বলে মনে হচ্ছে না আমার জন্য. এই থ্রেড থেকে Rentina স্ক্রিন মাপের জন্য সামঞ্জস্য যোগ করা হয়েছে, এবং পর্দা ShotButton unhighlighting যোগ করা হয়েছে। আমি যে দৃশ্যটি ব্যবহার করছি তা হল বোতাম এবং লেবেলের স্টোরিবোর্ডড স্ক্রীন এবং প্রোগ্রামের মাধ্যমে পরে বেশ কয়েকটি UIView যুক্ত করা হয়েছে।


সুইফ্ট 4:

func makeImage(withView view: UIView) -> UIImage? {

    let rect = view.bounds

    UIGraphicsBeginImageContextWithOptions(rect.size, true, 0)

    guard let context = UIGraphicsGetCurrentContext() else {
      assertionFailure()
      return nil
    }

    view.layer.render(in: context)

    guard let image = UIGraphicsGetImageFromCurrentImageContext() else {
      assertionFailure()
      return nil
    }

    UIGraphicsEndImageContext()

    return image
}

রেটিনা প্রদর্শনের জন্য একটি চেক বিবেচনা করে নিম্নলিখিত কোড স্নিপেটটি ব্যবহার করুন:

#import <QuartzCore/QuartzCore.h> 

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale);
} else {
    UIGraphicsBeginImageContext(self.window.bounds.size);
}

[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image);
if (imageData) {
    [imageData writeToFile:@"screenshot.png" atomically:YES];
} else {
    NSLog(@"error while taking screenshot");
}

দেখুন থেকে স্ক্রিনশট পান

-(UIImage *)getScreenshotImage {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        UIGraphicsBeginImageContextWithOptions(self.view.frame.size, FALSE, 2.0);
    } else {
        UIGraphicsBeginImageContextWithOptions(self.view.frame.size, FALSE, 1.0);
    }

    [self.view.window.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return result;
}

ছবিতে ছবি সংরক্ষণ করুন

UIImageWriteToSavedPhotosAlbum(YOUR_IMAGE, nil, nil, nil);

কিভাবে

UIImageWriteToSavedPhotosAlbum([self getScreenshotImage], nil, nil, nil);

- (UIImage*) getGLScreenshot {
    NSInteger myDataLength = 320 * 480 * 4;

    // allocate array and read pixels into it.
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // gl renders "upside down" so swap top to bottom into new array.
    // there's gotta be a better way, but this works.
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    for(int y = 0; y <480; y++)
    {
        for(int x = 0; x <320 * 4; x++)
        {
            buffer2[(479 - y) * 320 * 4 + x] = buffer[y * 4 * 320 + x];
        }
    }

    // make data provider with data.
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);

    // prep the ingredients
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = 4 * 320;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    // make the cgimage
    CGImageRef imageRef = CGImageCreate(320, 480, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

    // then make the uiimage from that
    UIImage *myImage = [UIImage imageWithCGImage:imageRef];
    return myImage;
}

- (void)saveGLScreenshotToPhotosAlbum {
    UIImageWriteToSavedPhotosAlbum([self getGLScreenshot], nil, nil, nil);  
}

Source


UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.myView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSData *imageData = UIImageJPEGRepresentation(image, 1.0 ); //you can use PNG too
[imageData writeToFile:@"image1.jpeg" atomically:YES];




screenshot