我可以在不移动太多内存的情况下在UIImageView中编辑UIImage的Alpha蒙版吗?

| 我想拍摄图像(画笔)并将其绘制到显示的图像中。我只想影响该图像的Alpha,以后需要将其导出。 从我所看到的,大多数方向只能真正进入一些代价不菲的行动。即,他们建议您在每次应用画笔时都绘制到屏幕外上下文中,创建蒙版的CGImage,并创建一个CGImageWithMask。 我已经知道这是很昂贵的,因为即使这样做,并将其绘制到上下文中,对于iPhone来说也相当粗糙。 我想做的是获取UIImageView的UIImage,并直接操纵它的Alpha通道。我也不是逐个像素地执行此操作,而是使用较大的(半径为20px的画笔)具有自己的柔和度。     
已邀请:
我不会为此使用UIImageView。普通的UIView就足够了。 只需将图像放入图层
UIView *view = ...
view.layer.contents = (id)image.CGImage;
之后,您可以通过在图层上添加遮罩来使图像的一部分透明
CALayer *mask = [[CALayer alloc] init]
mask.contents = maskimage.CGImage;
view.layer.mask = mask;
对于一个项目,我做了一些我拥有brush.png的操作,您可以用它来显示手指的图像。我的更新遮罩功能是:
- (void)updateMask {

    const CGSize size = self.bounds.size;
    const size_t bitsPerComponent = 8;
    const size_t bytesPerRow = size.width; //1byte per pixel
    BOOL freshData = NO;
    if(NULL == _maskData || !CGSizeEqualToSize(size, _maskSize)) {
        _maskData = calloc(sizeof(char), bytesPerRow * size.height);
        _maskSize = size;
        freshData = YES;
    }

    //release the ref to the bitmat context so it doesn\'t get copied when we manipulate it later
    _maskLayer.contents = nil;
    //create a context to draw into the mask
    CGContextRef context = 
    CGBitmapContextCreate(_maskData, size.width, size.height, 
                          bitsPerComponent, bytesPerRow,
                          NULL,
                          kCGImageAlphaOnly);
    if(NULL == context) {
        LogDebug(@\"Could not create the context\");
        return;
    }

    if(freshData) {
        //fill with mask with alpha == 0, which means nothing gets revealed
        CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
        CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));    
    }

    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0f, -1.0f);

    //Draw all the points in the array into a mask
    for (NSValue* pointValue in _pointsToDraw)
    {
        CGPoint point;
        [pointValue getValue:&point];
        //LogDebug(@\"location: %@\", NSStringFromCGPoint(point));

        [self drawBrush:[_brush CGImage] at:point inContext:context];
    }
    [_pointsToDraw removeAllObjects];

    //extract an image from it
    CGImageRef newMask = CGBitmapContextCreateImage(context);

    //release the context
    CGContextRelease(context);

    //now update the mask layer
    _maskLayer.contents = (id)newMask;
    //self.layer.contents = (id)newMask;
    //and release the mask as it\'s retained by the layer
    CGImageRelease(newMask);
}
    

要回复问题请先登录注册