iOS图片压缩
2016-07-06 13:21
393 查看
做上传图片功能,特别是类似于微信,QQ里面,发布9张图片, 少不了碰到一个问题,就是图片压缩问题.我研究了这个问题,发现网上普遍的方法是如下 //压缩图片质量 +(UIImage *)reduceImage:(UIImage *)image percent:(float)percent { NSData *imageData = UIImageJPEGRepresentation(image, percent); UIImage *newImage = [UIImage imageWithData:imageData]; return newImage; } //压缩图片尺寸 + (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize { // Create a graphics image context UIGraphicsBeginImageContext(newSize); // new size [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; // Get the new image from the context UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); // End the context UIGraphicsEndImageContext(); // Return the new image. return newImage; } 上面的方法比较常见,可是需要加载到内存中来处理图片,当图片数量多了的时候就会收到内存警告,程序崩溃, 我测试过上面方法,上面方法真不好用,真的不推荐大家用.那么我推荐下面这个方法: static size_t getAssetBytesCallback(voidvoid *info, voidvoid *buffer, off_t position, size_t count) { ALAssetRepresentation *rep = (__bridge id)info; NSError *error = nil; size_t countRead = [rep getBytes:(uint8_t *)buffer fromOffset:position length:count error:&error]; if (countRead == 0 && error) { // We have no way of passing this info back to the caller, so we log it, at least. NSLog(@"thumbnailForAsset:maxPixelSize: got an error reading an asset: %@", error); } return countRead; } static void releaseAssetCallback(voidvoid *info) { // The info here is an ALAssetRepresentation which we CFRetain in thumbnailForAsset:maxPixelSize:. // This release balances that retain. CFRelease(info); } // Returns a UIImage for the given asset, with size length at most the passed size. // The resulting UIImage will be already rotated to UIImageOrientationUp, so its CGImageRef // can be used directly without additional rotation handling. // This is done synchronously, so you should call this method on a background queue/thread. <pre code_snippet_id="1747779" snippet_file_name="blog_20160706_1_5109449" name="code" class="objc">//压缩时调用该放发即可,最好在子线程调用 - (UIImage *)thumbnailForAsset:(ALAsset *)asset maxPixelSize:(NSUInteger)size { NSParameterAssert(asset != nil); NSParameterAssert(size > 0); ALAssetRepresentation *rep = [asset defaultRepresentation]; CGDataProviderDirectCallbacks callbacks = { .version = 0, .getBytePointer = NULL, .releaseBytePointer = NULL, .getBytesAtPosition = getAssetBytesCallback, .releaseInfo = releaseAssetCallback, }; CGDataProviderRef provider = CGDataProviderCreateDirect((voidvoid *)CFBridgingRetain(rep), [rep size], &callbacks); CGImageSourceRef source = CGImageSourceCreateWithDataProvider(provider, NULL); CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(source, 0, (__bridge CFDictionaryRef) @{ (NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES, (NSString *)kCGImageSourceThumbnailMaxPixelSize : [NSNumber numberWithInt:size], (NSString *)kCGImageSourceCreateThumbnailWithTransform : @YES, }); CFRelease(source); CFRelease(provider); if (!imageRef) return nil; UIImage *toReturn = [UIImage imageWithCGImage:imageRef]; CFRelease(imageRef); return toReturn; } 采用上面的方法之后内存占用率很低!
相关文章推荐
- iOS开发——Watch开发环境设置
- iOS中图片压缩的常见方法
- IOS-抽屉效果
- iOS实现头像选取(照相或者图片库)、大小等比缩放、生成圆形头像 (转)
- iOS 给文字上面加贯穿横线
- iOS开发经验相关知识
- iOS开发经验相关知识
- 多任务
- iOS巅峰之根据图片链接生成图片
- 学习方法
- IOS 设置百度地图自定义标注图片,自定义泡泡
- IOS使用ijkPlayer(转)
- iOS-Echarts动态图表控件的使用
- 一步一步拆解一个简单的iOS轮播图(三图)
- ios发布 证书错误
- podfile
- iOS自动布局高级用法 && 纯代码约束写法
- iOS 蓝牙外设检索、发送、接受数据问题。
- Cordoval在iOS中的运用整理
- iOS Runtime 实践(1)