UIGraphicsBeginImageContext vs CGBitmapContextCreate

前端 未结 1 727
感动是毒
感动是毒 2021-01-01 05:37

I\'m trying to change color of an image in a background thread.
Apple doc says UIGraphicsBeginImageContext can only be called from main thread, and I\'m trying to use CG

相关标签:
1条回答
  • 2021-01-01 06:15

    Your second method is doing work that the first never did. Here's an adjustment of the second method to more closely match the first one:

    - (UIImage*) changeColor: (UIColor*) aColor
    {
        if(aColor == nil)
            return self;
    
        CGContextRef context = CreateARGBBitmapContext(self.size);
    
        CGRect bounds;
        bounds.origin = CGPointMake(0,0);
        bounds.size = self.size;
    
        CGContextSetFillColorWithColor(aColor.CGColor);
    
        CGContextClipToMask(context, bounds, [self CGImage]);
        CGContextFillRect(context, bounds);
    
        CGImageRef imageRef = CGBitmapContextCreateImage(context);
        UIImage* img = [UIImage imageWithCGImage: imageRef];
        CGContextRelease(context);
    
        return img;
    }
    

    The two changes I made were I converted this to use CGContextSetFillColorWithColor(), and I removed the dangerous and incorrect free() of the backing data of the bitmap context. If this code snippet does not behave identically to the first one, then you will have to look at your implementation of CreateARGBBitmapContext() to verify that it is correct.

    Of course, as Brad Larson mentioned in the comments, if you're targeting iOS 4.0 and above, the UIKit graphics methods are (according to the release notes) thread-safe and you should be able to use the first method just fine.

    0 讨论(0)
提交回复
热议问题