如何从 CGContextRef 获取 CGImageRef?
How to get CGImageRef from CGContextRef?
我正在尝试将两个图像添加到上下文中,但是它不起作用并抛出
GBitmapContextCreateImage: invalid context 0x0
错误。我使用以下代码:
//some image
CGImageRef image = ...
//some image as well, but masked. Works perfectly.
CGImageRef blurredAndMasked = CGImageCreateWithMask(blurred, mask);
//Both images are fine. Sure.
//Initializing the context and color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(nil, frameSize.width, frameSize.height, 8, 0, colorSpace, kCGBitmapAlphaInfoMask);
//Drawing images into the context
CGContextDrawImage(ctx, CGRectMake(0, 0, frameSize.width, frameSize.height), image);
CGContextDrawImage(ctx, CGRectMake(0, 0, frameSize.width, frameSize.height), blurredAndMasked);
//getting the resulting image
CGImageRef ret = CGBitmapContextCreateImage(ctx);
//releasing the stuff
CGImageRelease(image);
CGImageRelease(blurred);
CGImageRelease(blurredAndMasked);
CGColorSpaceRelease(colorSpace);
CGContextRelease(ctx);
这看起来不错,但生成的图像全黑或看起来非常类似于:
代码中应该更改什么?提前致谢!
kCGBitmapAlphaInfoMask
不是 CGBitmapContextCreate
的最后一个 (bitmapInfo
) 参数的有效值。它是一个掩码(因此得名),您可以使用 &
运算符从 CGBitmapInfo
值中获取 CGImageAlphaInfo
。你永远不会在 CGBitmapInfo
或 CGImageAlphaInfo
预期的地方传递 kCGBitmapAlphaInfoMask
。
假设您不需要特定的字节顺序,我相信这是在 iOS 上带有 alpha 通道的最高性能像素格式:
CGContextRef ctx = CGBitmapContextCreate(nil,
frameSize.width, frameSize.height, 8, 0, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
这应该是没有 alpha 通道的最高性能:
CGContextRef ctx = CGBitmapContextCreate(nil,
frameSize.width, frameSize.height, 8, 0, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);
我正在尝试将两个图像添加到上下文中,但是它不起作用并抛出
GBitmapContextCreateImage: invalid context 0x0
错误。我使用以下代码:
//some image
CGImageRef image = ...
//some image as well, but masked. Works perfectly.
CGImageRef blurredAndMasked = CGImageCreateWithMask(blurred, mask);
//Both images are fine. Sure.
//Initializing the context and color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(nil, frameSize.width, frameSize.height, 8, 0, colorSpace, kCGBitmapAlphaInfoMask);
//Drawing images into the context
CGContextDrawImage(ctx, CGRectMake(0, 0, frameSize.width, frameSize.height), image);
CGContextDrawImage(ctx, CGRectMake(0, 0, frameSize.width, frameSize.height), blurredAndMasked);
//getting the resulting image
CGImageRef ret = CGBitmapContextCreateImage(ctx);
//releasing the stuff
CGImageRelease(image);
CGImageRelease(blurred);
CGImageRelease(blurredAndMasked);
CGColorSpaceRelease(colorSpace);
CGContextRelease(ctx);
这看起来不错,但生成的图像全黑或看起来非常类似于:
代码中应该更改什么?提前致谢!
kCGBitmapAlphaInfoMask
不是 CGBitmapContextCreate
的最后一个 (bitmapInfo
) 参数的有效值。它是一个掩码(因此得名),您可以使用 &
运算符从 CGBitmapInfo
值中获取 CGImageAlphaInfo
。你永远不会在 CGBitmapInfo
或 CGImageAlphaInfo
预期的地方传递 kCGBitmapAlphaInfoMask
。
假设您不需要特定的字节顺序,我相信这是在 iOS 上带有 alpha 通道的最高性能像素格式:
CGContextRef ctx = CGBitmapContextCreate(nil,
frameSize.width, frameSize.height, 8, 0, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
这应该是没有 alpha 通道的最高性能:
CGContextRef ctx = CGBitmapContextCreate(nil,
frameSize.width, frameSize.height, 8, 0, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);