Capturing the screen and saving it as an image file

Capturing the screen and saving it as an image file

Procedure of capturing image of a UIView

Create a Bitmap Context

Get the CALayer object (calayer, for example) through UIView’s layer property

Call CALayer’s renderInContext: with passing the Bitmap Context as the argument, now you got the captured image in the bitmap context

Get a CGImageRef from CGBitmapContextCreateImage( Bitmap Context ) call

Create an UIImage object by calling [UIImage imageWithCGImage: CGImageRef ]

Call UIImagePNGRepresentation( UIImage object) to get a PNG data (NSData * type)

Save the PNG data to a file

To save a JPEG image, call UIImageJPEGRepresentation() instead of UIImagePNGRepresentation()

Data flow:

UIWindow -> CALayer -> Bitmap Context -> CGImageRef -> UIImage -> NSData * -> PNG/JPEG file

Example code:

NSData *imageData = UIImagePNGRepresentation(capturedImage);

if(imageData != nil)

{

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsPath = [paths objectAtIndex:0];

NSString *filePath = [documentsPath stringByAppendingPathComponent:@”myfile.png”];

[imageData writeToFile:filePath atomically:YES];

}

EDIT: The procedure above generates corrupted pixels when there is transparent pixels (not fully opaque, through alpha value). Instead, following piece of code works better and even simpler.

+ (UIImage *) captureImageOfView:(UIView *)srcView

{

UIGraphicsBeginImageContext(srcView.bounds.size);

[srcView.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *anImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return anImage;

}

However, there is report the smilar code capturing image of the UIWindow object, that represents the whole screen, still corrupts some part of the image, according this link: http://stackoverflow.com/questions/1902741/captured-uiview-image-has-distorted-colors-iphone-sdk

UIGraphicsBeginImageContext(self.view.window.frame.size);

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

UIImage *anImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

So, it is strongly recommended to capture the entire screen using UIGetScreenImage().

Capture screenshot:

CGImageRef cgImg=UIGetScreenImage();

UIImage *scImage=[UIImage imageWithCGImage:cgImg];

CFRelease(cgImg);

Saving image to “Saved Photo” album

UIImageWriteToSavedPhotosAlbum

Adds the specified image to the user’s Saved Photos album.

void UIImageWriteToSavedPhotosAlbum (

UIImage *image,

id completionTarget,

SEL completionSelector,

void *contextInfo

);

Scroll to Top

Discover more from CODE t!ps

Subscribe now to keep reading and get access to the full archive.

Continue reading