TestsTested | ✗ |
LangLanguage | Obj-CObjective C |
License | MIT |
ReleasedLast Release | Dec 2014 |
Maintained by Unclaimed.
An Objective-C operation to resize your images correctly and quickly.
BOSImageResizeOperation uses ARC and has been tested with iOS 4.3 and above.
Add BOSImageResizeOperation.h
and BOSImageResizeOperation.m
to your project. You'll need to enable ARC for your project, or just for BOSImageResizeOperation.m
, which is left as an exercise for the reader.
Create an instance of BOSImageResizeOperation and initialize it with either a path to a file or a UIImage object.
// We already have the image in memory, e.g. from UIImagePickerController
UIImage* image = info[UIImagePickerControllerOriginalImage];
BOSImageResizeOperation* op = [[BOSImageResizeOperation alloc] initWithImage:image];
// We don't have the image in memory; it will be loaded on a background thread
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString* inputPath = [documentsPath stringByAppendingPathComponent:@"large_image.jpg"];
BOSImageResizeOperation* op = [[BOSImageResizeOperation alloc] initWithPath:inputPath];
Specify how you'd like the image resized. Any of these can be combined.
Resize the image proportionally so it fits within the given size:
[op resizeToFitWithinSize:CGSizeMake(200.f, 200.f)];
Crop the image to the given aspect ratio:
[op cropToAspectRatioWidth:16 height:9];
Write the image to disk when finished (optional). The format will be PNG by default and JPEG if the output path ends in ".jpg". For JPEG output, the JPEGcompressionQuality
property can be used to specify compression quality, from 0.0 to 1.0. The default is 0.8.
NSString* outputPath = [documentsPath stringByAppendingPathComponent:@"small_image.jpg"];
op.JPEGcompressionQuality = 0.5;
[op writeResultToPath:outputPath];
Start the operation.
On the current thread (for example, if we're already on a background thread):
[op start];
In the background, using an NSOperationQueue:
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
// Avoid a retain cycle (ARC & iOS 5+)
__weak BOSImageResizeOperation* weakOp = op;
[op setCompletionBlock:^{
UIImage* smallerImage = weakOp.result;
}];
[queue addOperation:op];
In the background, using Grand Central Dispatch:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[op start];
UIImage* smallerImage = op.result;
});
Do something with the image. If an error ocurred while resizing the image, the result
property will be nil.
BOSImageResizeOperation was written by Alex Michaud, based on techniques cobbled together from all over the Internet and Stack Overflow. Contributions are welcome and will help create a utopia where all iOS apps resize images the right way, no matter what edge cases are uncovered. Follow or say hi on Twitter: @bucketosoftware
BOSImageResizeOperation is available under the MIT license. See the LICENSE file for more information.