วิธีถ่ายภาพหน้าจอแบบเป็นโปรแกรมบน iOS


คำตอบ:


233

การพิจารณาเช็คสำหรับจอแสดงผลเรตินาใช้ข้อมูลโค้ดต่อไปนี้:

#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");
}

13
โปรดทราบว่าสิ่งนี้จะไม่บันทึกเนื้อหาหน้าจอบางประเภทเช่นเลเยอร์ OpenGL ES UIGetScreenImage () ซึ่งหัวหยิงชี้ไปที่
Brad Larson

12
คนที่รักอย่าลืมทำ #import <QuartzCore / QuartzCore.h>
Enrico Susatyo

สิ่งนี้จะถ่ายภาพหน้าจอหากคุณดูรูปภาพที่แอปของคุณเพิ่งถ่าย
John Riselvato

5
รูปภาพนี้ถูกเก็บไว้ที่ไหน?
Burhanuddin Sunelwala

3
@ wladimir-palant: แล้ว Key-Board เพราะเมื่อฉันใช้เพื่อถ่ายภาพหน้าจอของ sceen ที่ผู้ใช้พิมพ์แล้วกระดานคีย์ไม่จับภาพฉันจะเพิ่ม key-Board ในการจับภาพหน้าจอได้อย่างไร?
g212gs

46

วิธีการด้านล่างใช้ได้กับวัตถุ OPENGL ด้วย

//iOS7 or above
- (UIImage *) screenshot {

    CGSize size = CGSizeMake(your_width, your_height);

    UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);

    CGRect rec = CGRectMake(0, 0, your_width, your_height);
    [_viewController.view drawViewHierarchyInRect:rec afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

5
UIGetScreenImageเป็น API ส่วนตัว
jonahb

ขอบคุณมากสำหรับสิ่งนี้! คุณได้รับคะแนนของฉันแน่นอน หลังจากพยายามหลายวิธีอื่น ๆ ปรากฏว่า drawViewHierarchy เป็นวิธีเดียวที่การคว้าหน้าจอใน robovm ด้วย javafx ui
Christo Smal

นี่คือสิ่งที่ทำงานทุกครั้ง !!!! ฉันมีการแปลง 3 มิติจำนวนมากบนหน้าจอและวิธีการแก้ปัญหาอื่น ๆ ที่ไม่เป็นระเบียบในภาพหน้าจอของฉัน ใช้งานได้ตามที่ควรจะเป็น ขอบคุณมาก!
AndrewK

1
ถ้าตัวควบคุมมุมมองอยู่ในตัวควบคุมการนำทางแถบนำทางจะไม่ถูกบันทึกไว้
Radu Simionescu

ใช่ drawViewHierarchyInRect เร็วกว่า renderInContext :-)
alones

20
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];

1
+1 สำหรับหมายเหตุเกี่ยวกับการใช้ PNG มันไม่มีความสูญเสียและจะเล็กกว่า jpeg ที่มีคุณภาพ = 1.0
Rob

1
ไม่ได้ใช้ NavigationBar ใน iOS 7 แทนที่จะปล่อยให้มีพื้นที่ว่าง
Ali Sufyan

14
- (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);  
}

แหล่ง


1
ทำไม myDataLength คูณด้วย 4 ontop 320 * 480
Jab

2
สิ่งนี้ดูเหมือนโง่มาก ๆ ที่พวกเขาไม่ได้ให้วิธีที่ง่ายกว่าในการทำเช่นนี้
Jab

320 * 480 คือจำนวนพิกเซล คูณสี่เพื่อให้คุณมี RGBA สำหรับแต่ละพิกเซล
Aistina

อย่าลืมคูณด้วยตัวคูณสเกลเมื่อทำงานบน iPhone 4 :-)
MrDatabase

1
@Aistina ใช้UIImage *myImage = [[UIImage alloc] initWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationDownMirrored];แล้วคุณไม่ต้องการ 'buffer2' อีกต่อไป BTW ดูเหมือนว่าฉันเหมือนคุณลืมเกี่ยวกับการจัดการหน่วยความจำไม่มีการโทร () หรือปล่อย () ฟรี ...
Oleg Trakhman

10

ในสวิฟท์

func captureScreen() -> UIImage
{

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

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

    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return image
}

9

ดูโพสต์นี้ดูเหมือนว่าคุณสามารถใช้ UIGetScreenImage () ได้ในตอนนี้


9
สิ่งนี้ไม่ได้รับอนุญาตอีกครั้งใน iOS 4
sudo rm -rf

9

ตั้งแต่ iOS10 สิ่งนี้จะง่ายขึ้นเล็กน้อย UIKit มาพร้อมกับUIGraphicsImageRenderที่ช่วยให้คุณ

... บรรลุภารกิจการวาดภาพโดยไม่ต้องจัดการกับการกำหนดค่าเช่นความลึกของสีและขนาดภาพหรือจัดการบริบทกราฟิกคอร์

เอกสาร Apple - UIGraphicsImageRenderer

ดังนั้นตอนนี้คุณสามารถทำสิ่งนี้:

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

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

คำตอบมากมายที่นี่ใช้ได้สำหรับฉันในกรณีส่วนใหญ่ แต่เมื่อพยายามที่จะถ่ายภาพของARSCNViewฉันก็สามารถทำได้โดยใช้วิธีการที่อธิบายไว้ข้างต้น แม้ว่าอาจเป็นที่น่าสังเกตว่าในเวลานี้ ARKit ยังอยู่ในช่วงเบต้าและ Xcode อยู่ในช่วงเบต้า 4


7

นี่จะเป็นการบันทึกภาพหน้าจอและจะคืนภาพหน้าจอด้วย

-(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;
}

5

ฉันคิดว่าตัวอย่างต่อไปนี้จะช่วยหากคุณต้องการใช้แบบเต็มหน้าจอ ( ยกเว้นแถบสถานะ ) เพียงแค่แทนที่ AppDelegate ด้วยชื่อตัวแทนแอปของคุณหากจำเป็น

- (UIImage *)captureFullScreen {

    AppDelegate *_appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        // for retina-display
        UIGraphicsBeginImageContextWithOptions(_appDelegate.window.bounds.size, NO, [UIScreen mainScreen].scale);
        [_appDelegate.window drawViewHierarchyInRect:_appDelegate.window.bounds afterScreenUpdates:NO];
    } else {
        // non-retina-display
        UIGraphicsBeginImageContext(_bodyView.bounds.size);
        [_appDelegate.window drawViewHierarchyInRect:_appDelegate.window.bounds afterScreenUpdates:NO];
    }

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

ในที่สุดหนึ่งที่เพิ่มแถบนำทาง! จะลงคะแนนสองครั้งถ้าฉันทำได้! ไชโยเพื่อน
marcelosarquis

4

ฉันไม่พบคำตอบจากการใช้งาน Swift 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
}

3

สำหรับ iOS 7.0 หรือสูงกว่า ..

หากคุณต้องการจับภาพหน้าจอของมุมมองพูด (myView) คุณสามารถทำได้ด้วยบรรทัดเดียว:

[myView snapshotViewAfterScreenUpdates:NO];

3

สิ่งนี้จะทำงานกับswift 4.2 , ภาพหน้าจอจะถูกบันทึกไว้ในไลบรารี่, แต่โปรดอย่าลืมแก้ไขinfo.plist @ NSPhotoLibraryAddUsageDescription:

  @IBAction func takeScreenshot(_ sender: UIButton) {

    //Start full Screenshot
    print("full Screenshot")
    UIGraphicsBeginImageContext(card.frame.size)
    view.layer.render(in: UIGraphicsGetCurrentContext()!)
    var sourceImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    UIImageWriteToSavedPhotosAlbum(sourceImage!, nil, nil, nil)

    //Start partial Screenshot
    print("partial Screenshot")
    UIGraphicsBeginImageContext(card.frame.size)
    sourceImage?.draw(at: CGPoint(x:-25,y:-100)) //the screenshot starts at -25, -100
    var croppedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    UIImageWriteToSavedPhotosAlbum(croppedImage!, nil, nil, nil)

}

2

รับภาพหน้าจอจากมุมมอง

-(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);

2

รับภาพหน้าจอจากมุมมอง:

- (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
}

หวังว่านี่คือสิ่งที่คุณกำลังมองหา ความกังวลใด ๆ กลับมาหาฉัน :)


2

ฉันกำลังตอบคำถามนี้เพราะมันมีผู้เข้าชมสูงและมีคำตอบมากมายรวมถึง Swift และ Obj-C

ข้อจำกัดความรับผิดชอบ นี่ไม่ใช่รหัสของฉัน หรือคำตอบของฉัน นี่เป็นเพียงเพื่อช่วยให้ผู้คนที่มาที่นี่หาคำตอบได้อย่างรวดเร็ว มีลิงก์ไปยังคำตอบดั้งเดิมเพื่อให้เครดิตเมื่อถึงกำหนดเครดิต !! โปรดเคารพคำตอบดั้งเดิมด้วย +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
}

หมายเหตุ: เนื่องจากเป็นธรรมชาติของการเขียนโปรแกรม การอัพเดตอาจต้องทำดังนั้นโปรดแก้ไขหรือแจ้งให้เราทราบ! * นอกจากนี้หากฉันไม่ได้รวมคำตอบ / วิธีการที่คุ้มค่ารวมทั้งอย่าลังเลที่จะแจ้งให้ฉันทราบด้วยเช่นกัน!


1
คำตอบนี้ดูเหมือนจะไม่เพิ่มอะไรเลย คุณเพิ่งคัดลอกคำตอบสองข้อที่มีอยู่แล้วในหน้าและโพสต์ผลการค้นหาของคุณ
user2357112 รองรับ Monica

ความตั้งใจของฉันคือการไม่ให้เครดิตสำหรับคำตอบของพวกเขามันรวมทั้งรวดเร็วและ Obj-C ในหนึ่งคำตอบดังนั้นมันจึงเร็วสำหรับผู้คนในการค้นหา ฉันพูดถึงคำตอบที่เกี่ยวข้องเช่นกัน หากไม่สามารถทำได้ฉันจะลบคำตอบและเปลี่ยนกลับเป็นหนึ่งในนั้น
Jab

ฉันใช้โซลูชัน ObjC สำหรับฉันฉันต้องเพิ่ม ".view" หลังจาก "self" แต่ผลลัพธ์คือ 100% นี่คือ GOLD
samouray

มันทำงานให้กับการจับภาพการนำเสนอด้วย ขอบคุณ
แฟน YSR

1

อีกทางเลือกหนึ่งคือการใช้เครื่องมืออัตโนมัติในเครื่องมือ คุณเขียนสคริปต์เพื่อให้หน้าจอเป็นสิ่งที่คุณต้องการแล้วถ่ายรูป นี่คือสคริปต์ที่ฉันใช้กับหนึ่งในแอพของฉัน เห็นได้ชัดว่ารายละเอียดของสคริปต์จะแตกต่างกันสำหรับแอปของคุณ

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");

1

สองตัวเลือกมีอยู่ที่เว็บไซต์ร้อง:

ตัวเลือกที่ 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/


1

เพียงแค่การช่วยเหลือเล็กน้อยฉันได้ทำสิ่งนี้ด้วยปุ่ม แต่การกดยังหมายถึงการกดปุ่มด้วย ดังนั้นก่อนอื่นฉันก็ไฮไลต์

- (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 จากเธรดนี้และการไฮไลต์ของ screenShotButton มุมมองที่ฉันใช้อยู่เป็นหน้าจอปุ่มและป้ายกำกับของ StoryBoarded และมีการเพิ่ม UIView หลายรายการในภายหลังผ่านโปรแกรม


ขอบคุณ the_UB สำหรับการแก้ไข ฉันรู้ว่าฉันทิ้งรหัสไว้ในคอมเม้นต์แล้ว แต่คิดว่า "นั่นคือวิธีการวางรหัสของแท้" รหัสการทำงานสดซึ่งขณะนี้อยู่ใน App Store
Symanski

1

ใน Swiftคุณสามารถใช้รหัสต่อไปนี้

if UIScreen.mainScreen().respondsToSelector(Selector("scale")) {
    UIGraphicsBeginImageContextWithOptions(self.window!.bounds.size, false, UIScreen.mainScreen().scale)
}
else{
    UIGraphicsBeginImageContext(self.window!.bounds.size)
}
self.window?.layer.renderInContext(UIGraphicsGetCurrentContext())
var image : UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)

0

สวิฟท์ 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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.