Skip to content

stonly916/AsynDisplayImage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

AsynDisplayImage

Asyn display image/render image/draw image with Bitmap Context

简书文章地址:https://www.jianshu.com/p/9b30109b302e

左上角零点y向下坐标系和左下角零点y向上坐标系的展示。 测试异步绘制图片方法,也有单纯的解压图片方法等。

主要代码,异步绘制图片: UIImageView(AsynDealImage)


- (void)setCurrentImage:(UIImage *)image 
{
    objc_setAssociatedObject(self, @selector(currentImage), image, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIImage *)currentImage 
{
    return objc_getAssociatedObject(self, @selector(currentImage));
}

-(void)asynDealImage:(UIImage *)image type:(SYDealImageType)type
{
    self.image = nil;
    self.currentImage = image;
    

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImage *newImage = image;
        if (type == SYDealImageTypeAsynDrawOnePixel) {
            //异步绘制可能会失效,因为在调用dispatch_async后系统可能会删除解压数据和渲染数据。
            //绘制单个像素,来实现解压,系统缓存,并提前渲染
            [UIImageView displayOnePixelImage:image];
        }else if (type == SYDealImageTypeAsynDraw) {
            newImage = [UIImageView displayImageCoreGrahpic:image];
        } else if (type == SYDealImageTypeAsynBitmapDraw) {
            //bitmap绘制整个图片,直接获取解压、提前渲染并优化后的图片
            newImage = [UIImageView imageDecodeByBitmap:image];
        } else if (type == SYDealImageTypeAsynDecompression) {
            //CGImageCreate解压图片
            newImage = [UIImageView dataProviderDecodeImage:image];
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            if (self.currentImage == image) {
                self.image = newImage;
            }
        });
    });
}

 + (UIImage *)imageDecodeByBitmap:(UIImage *)image
{
    //创建一个bitmap的context,并把它设置成为当前正在使用的context
    
    CGImageRef imgRef = image.CGImage;
    size_t width = CGImageGetWidth(imgRef);
    size_t height = CGImageGetHeight(imgRef);
    
    CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imgRef);

    BOOL hasAlpha = NO;
    if (alphaInfo == kCGImageAlphaPremultipliedLast ||
        alphaInfo == kCGImageAlphaPremultipliedFirst ||
        alphaInfo == kCGImageAlphaLast ||
        alphaInfo == kCGImageAlphaFirst) {
        hasAlpha = YES;
    }
    CGBitmapInfo info = kCGBitmapByteOrder32Host | (hasAlpha ? kCGImageAlphaPremultipliedFirst: kCGImageAlphaNoneSkipFirst);
    //创建一个bitmap的context
    CGContextRef ctx = CGBitmapContextCreate(NULL, width, height, 8, 0, SharedCGColorSpaceGetDeviceRGB(), info);

    CGContextDrawImage(ctx, CGRectMake(0, 0, width, height), imgRef);
    
    CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);
    
    image = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    
    return image;
}

About

Asyn display image/render image/draw image with Bitmap Context

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published