A Bad Day For Palm, RIM, Android, et. al. How To Enable Background Processing Using iPhone SDK 3.0
Mar 30

Recently there have been some interesting developer news related to working with images on the iPhone.

  • First there is Chris Greening’s open source project simple-iphone-image-processing, that provides a set of common image processing tasks .
  • Today I listened to the Mobile Orchard’s podcast Interview with Paul Cantrell, and the discussion was about UIKit, views, layers, etc. This was the most enlightening information I’ve come across on this topic ever. Highly recommended.

So, I thought I’d contribute a few UIImage routines that I’ve found useful.

Combine two UIImages

To add two UIImages together you need to make use of Graphics Context.

- (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 {
	UIGraphicsBeginImageContext(image1.size);

	// Draw image1
	[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];

	// Draw image2
	[image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];

	UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();

	UIGraphicsEndImageContext();

	return resultingImage;
}

Create a UIImage from a part of another UIImage

This requires a round-trip to Core Graphics land:

- (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect {
	CGImageRef sourceImageRef = [image CGImage];
	CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
	UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
	return newImage;
}

Save UIImage to Photo Album

This is just a one-liner:

UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextInfo:), context);

And to know if the save was successful:

- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
	NSString *message;
	NSString *title;
	if (!error) {
		title = NSLocalizedString(@"SaveSuccessTitle", @"");
		message = NSLocalizedString(@"SaveSuccessMessage", @"");
	} else {
		title = NSLocalizedString(@"SaveFailedTitle", @"");
		message = [error description];
	}
	UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
													message:message
												   delegate:nil
										  cancelButtonTitle:NSLocalizedString(@"ButtonOK", @"")
										  otherButtonTitles:nil];
	[alert show];
	[alert release];
}

written by Nick \\ tags: , , , , ,

12 Responses to “Image Processing Tricks”

  1. Paul Cantrell Says:

    Thanks for UIGraphicsBeginImageContext()! Somehow I’d never discovered it. Very useful indeed.

    Glad you liked the podcast!

  2. Johnny Bynum Says:

    Nice blog.. thanks for the info! What are you using to display the code snippets in your blog?

  3. Nick Says:

    @Johnny: Thanks for the feedback! For displaying code snippets I’m using this WP plugin: Google Syntax Highlighter for WordPress which in turn is built upon this open source project: Google Syntax Highlighter.

  4. MPY Says:

    Thanks for posting this. But you have any idea why if use UIGraphicsBeginImageContext it will not work unless I set the last 3 options to nil? If I use your code, it just crashes simulator.

  5. Vishal Says:

    These are really good tricks. Can we draw a rectangle on the image and then display on screen? I have image on which I want to draw rectangle and then display on scree.

  6. Nick Says:

    @Vishal: Yes, you should be able to draw a rect in between UIGraphicsBeginImageContext() and UIGraphicsEndImageContext(). And then render the resulting image to the screen.

  7. Nick Says:

    @MPY: I’m not sure what you mean. UIGraphicsBeginImageContext only takes one parameter, a CGSize.

  8. jeff Says:

    how do you do image effects like blurring, bumping, and distortions/warping?

    can you use Core Image Filters? If not, what else can you try? Thanks.

  9. Nick Says:

    @jeff: I have not developed any iPhone apps with that type of image effects, so I don’t know what the best way to do this is.

  10. Forrest Says:

    thanks for providing source codes for simple image processing based on iPhone.

    I have one question here , do you have try to use the opencv to iPhone ? I have searched that there are a lot people tried to compiler opencv based on iPhone, but never see one real application which use opencv to do image processing.

    Thanks

  11. Nick Says:

    @Forrest: Sorry, I have not used opencv.

  12. Forrest Says:

    @Nick,
    actually if you can make full use of opencv based on iPhone, that will be wonderful !
    Opencv is so powerful that you do not need to write any image processing algorithm. Just use them from OpenCV.
    Welcome for discussing on this topic with me , my contact is :
    SKYPE : forrest.shi
    EMAIL : forrest.shi@gmail.com

Leave a Reply