iOS-项目开发1-UIImage

UIImage+Extension

/// 获取后的数据 a.length > b.length. 同时,使用UIIMageJPEGRepresnetation压缩图片,如果compressionQuality设置为1.0,
得到的图片大小比原图大,测试之后,压缩比在0.7--0.8之间大致为原图的大小
NSData *a = UIImagePNGRepresentation(UIImage *image) NSData *b = UIIMageJPEGRepresnetation(UIImage * image, CGFloat compressionQuality)

1. 裁剪图片上的某一部分

/// 获取指定部分的图片
- (UIImage *)FF_AcquireSpecialSizeImage:(CGRect)rect {
    CGImageRef imageRef = [self CGImage];
    CGImageRef needImageRef = CGImageCreateWithImageInRect(imageRef, rect);
    return [UIImage imageWithCGImage:needImageRef];
}

2.将图片重画在某一部分,会压缩图片的质量

/// 重画图片到指定的Size
- (UIImage *)FF_CompressSize:(CGSize)size {
    UIImage *result = self;
    UIGraphicsBeginImageContext(size);
    [result drawInRect:CGRectMake(0, 0, size.width, size.height)];
    result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return result;  
}

3.将图片压缩到指定大小,压缩质量

/**
 将图片压缩到指定的质量
 
 @param kb 1MB == 1024KB
 @return 图片压缩后的质量
  使用二分法提高效率,一般通过6次,可以达到指定的大小,也有例外,之后通过缩小尺寸来实现目标
 */
- (NSData *)FF_CompressQualityToSpecialKB:(CGFloat)kb {
    CGFloat specialBytes = kb * 1024;
    NSData *imageDate = UIImageJPEGRepresentation(self, 1.0);
    if (imageDate.length < specialBytes) {
        return imageDate;
    }
    CGFloat min = 0;
    CGFloat max = 1;
    CGFloat compress = 1;
    for (int i = 0; i < 6; i++) {
        compress = (max + min) / 2;
        imageDate = UIImageJPEGRepresentation(self, compress);
        if (imageDate.length < specialBytes * 0.9) {
            min = compress;
        }else if (imageDate.length > specialBytes) {
            max = compress;
        }else {
            break;
        }
    }
    
    if (imageDate.length <= specialBytes) {
        return imageDate;
    }
    
    UIImage *tempImage = [UIImage imageWithData:imageDate];
    NSUInteger lastDateLength = 0;
    while (imageDate.length > specialBytes && lastDateLength != imageDate.length) {
        lastDateLength = imageDate.length;
        CGFloat tempScale = specialBytes / imageDate.length;
        CGSize tempSize = CGSizeMake((NSUInteger)(tempImage.size.width * tempScale),
                                     (NSUInteger)(tempImage.size.height * tempScale));
        UIGraphicsBeginImageContext(tempSize);
        [tempImage drawInRect:CGRectMake(0, 0, tempSize.width, tempSize.height)];
        tempImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        imageDate = UIImageJPEGRepresentation(tempImage, compress);
    }
    
    return imageDate;
}
 

4 通过颜色获取图片

+ (UIImage *)FF_AcquireImageFromColor:(UIColor *)color {
    UIGraphicsBeginImageContext(CGSizeMake(1, 1));
    CGContextRef ref = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(ref, color.CGColor);
    CGContextFillRect(ref, CGRectMake(0, 0, 1, 1));
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

5. 创建自定义的图库,并保存图片到自定义相册

/*
1. 导入框架 <Photo/Photo.h>
2. PHAsssetColoction 图库
3. PHAsset                图片集合
4. PHPhotoLibrary      在Library中进行各种操作,创建图库,图片等
5. PHAssetCollectionChangeRequest 创建PHAssetCollection
6. PHAssetChangeRequest   创建PHAsset
*/

- (PHAssetCollection *)FF_CreatePhotoLibrary {
    NSString *title = [[NSBundle mainBundle].infoDictionary objectForKey:(NSString *)kCFBundleNameKey];
    PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    PHAssetCollection *needCollection = nil;
    for (PHAssetCollection *collection in result) {
        if ([collection.localizedTitle isEqualToString:title]) {
            needCollection = collection;
        }
    }
    __block NSString *localIdentifierId = nil;
    if (!needCollection) {
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            localIdentifierId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
        } error:nil];
    }
    if (localIdentifierId) {
        needCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[localIdentifierId] options:nil].firstObject;
    }
    return needCollection;
}

/// 保存图片到相机相册
- (PHFetchResult<PHAsset *> *)FF_CreatedAssets {
    __block NSString *localIdentital = nil;
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        localIdentital = [PHAssetChangeRequest creationRequestForAssetFromImage:self].placeholderForCreatedAsset.localIdentifier;
    } error:nil];
    if (localIdentital) {
        return [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentital] options:nil];
    }else {
        return nil;
    }
}

/// 保存到自定义相册
- (void)FF_SaveImageToAlbum {
    if (![self FF_PhotoLibraryAuthorization]) {
        return;
    }
    PHAssetCollection *collection = [self FF_CreatePhotoLibrary];
    PHFetchResult<PHAsset *> *result = [self FF_CreatedAssets];
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection];
        [request insertAssets:result atIndexes:[NSIndexSet indexSetWithIndex:0]];
    } error:nil];
}
原文地址:https://www.cnblogs.com/jisa/p/10451446.html