一个用于正确且快速调整图片大小的 Objective-C 操作。
BOSImageResizeOperation 使用 ARC 并且已经在 iOS 4.3 及以上版本中进行了测试。
将 BOSImageResizeOperation.h
和 BOSImageResizeOperation.m
添加到您的项目中。您需要为项目启用 ARC,或者仅为 BOSImageResizeOperation.m
启用(后者留给读者练习)。
创建 BOSImageResizeOperation 的一个实例,并用文件路径或 UIImage 对象初始化它。
// 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];
指定您想要如何调整图片大小。这些可以组合使用。
调整 图片大小,使其适合给定的尺寸(按比例)
[op resizeToFitWithinSize:CGSizeMake(200.f, 200.f)];
裁剪 图片以适应给定的宽高比
[op cropToAspectRatioWidth:16 height:9];
写入 完成后的图片到磁盘(可选)。默认格式为 PNG,如果输出路径以 ".jpg" 结尾,则为 JPEG。对于 JPEG 输出,可以使用 aketGLEnabledQuality
属性指定压缩质量,范围从 0.0 到 1.0。默认值为 0.8。
NSString* outputPath = [documentsPath stringByAppendingPathComponent:@"small_image.jpg"];
op.JPEGcompressionQuality = 0.5;
[op writeResultToPath:outputPath];
启动操作。
在当前线程上(例如,如果我们已经在后台线程上)
[op start];
使用 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];
使用 Grand Central Dispatch 在后台
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[op start];
UIImage* smallerImage = op.result;
});
处理图片。如果调整图片时发生错误,则 result
属性将为 nil。
BOSImageResizeOperation 由 Alex Michaud 编写,基于从互联网和 Stack Overflow 中拼凑起来的技术。欢迎贡献,这将有助于创造一个理想世界,所有 iOS 应用都能正确调整图像大小,不管发现什么边缘情况。在 Twitter 上关注或打招呼: @bucketosoftware
BOSImageResizeOperation遵循MIT许可证。更多信息请参阅LICENSE文件。