CGbitmapcontext 和 alpha 的问题

Posted

技术标签:

【中文标题】CGbitmapcontext 和 alpha 的问题【英文标题】:Problems with CGbitmapcontext and alpha 【发布时间】:2014-05-01 19:31:11 【问题描述】:

我正在尝试使用 Core Graphics 开发绘图应用程序。我想让背景处于 alpha 状态,但它是黑色的。我尝试使用所有不同类型的 bitmapinfo 类型,但没有成功。 kCGImageAlphaPremultipliedLast 也不起作用。有谁知道如何解决这个问题?

- (BOOL) initContext:(CGSize)size 

    int bitmapByteCount;
    int bitmapBytesPerRow;

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow = (size.width * 4);
    bitmapByteCount = (bitmapBytesPerRow * size.height);

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    cacheBitmap = malloc( bitmapByteCount );
    if (cacheBitmap == NULL)
        return NO;
    

    CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst;

    cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), bitmapInfo);
    CGContextSetRGBFillColor(cacheContext, 0, 0, 0, 0);
    CGContextFillRect(cacheContext, (CGRect)CGPointZero, size);
    return YES;

【问题讨论】:

这里的代码没有指定 alpha 通道(因此 AlphaNone)我想你要找的可能是 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrderDefault 另外,正如所写,我相信你正在泄漏CGColorSpaceCreateDeviceRGB()分配的内存 你能解释更多关于泄漏内存的内容吗? 还是不行。 你如何确定它不起作用? 【参考方案1】:

我正在使用此代码来完成您所要求的几乎所有操作。我已将颜色设置为红色,alpha 为 50% 而不是 0%,因此您实际上可以看到 alpha 通道就在那里。

@implementation ViewController

    CGContextRef                    cacheContext;
    void*                           cacheBitmap;
    __weak IBOutlet UIImageView*    _imageView;


- (void)viewDidLoad

    [super viewDidLoad];


-(void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    [self setupContext:self.view.bounds.size];

    CGImageRef      cgImage = CGBitmapContextCreateImage(cacheContext);
    _imageView.image = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);



// Name changed to avoid using the magic word "init"
- (BOOL) setupContext:(CGSize)size

    int bitmapByteCount;
    int bitmapBytesPerRow;

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow = (size.width * 4);
    bitmapByteCount = (bitmapBytesPerRow * size.height);

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    cacheBitmap = malloc( bitmapByteCount );
    if (cacheBitmap == NULL)
        return NO;
    

    CGBitmapInfo    bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrderDefault;

    // Create and define the color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, colorSpace, bitmapInfo);
    CGContextSetRGBFillColor(cacheContext, 1., 0, 0, 0.5);
    CGContextFillRect(cacheContext, (CGRect)CGPointZero, size);

    // Release the color space so memory doesn't leak
    CGColorSpaceRelease(colorSpace);

    return YES;


@end

【讨论】:

谢谢!还发现我没有将视图设置为 [UIColor ClearColor]

以上是关于CGbitmapcontext 和 alpha 的问题的主要内容,如果未能解决你的问题,请参考以下文章

CGBitmapContext为 RBG565 创建 bitsPerComponent

这个 CGBitmapContext 有啥问题?

替换 CGBitmapContext 中的特定颜色

Bate和alpha能在一起吗?

alpha策略和beta策略

Riot v3.0.0-alpha.7 alpha.8 和 alpha.9 发布