1

我希望能够从应用程序包中的 png 创建一个没有 alpha 的灰度图像。

这行得通,我创建了一个图像:

// Create graphics context the size of the overlapping rectangle
UIGraphicsBeginImageContext(rectangleOfOverlap.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();

// More stuff

CGContextDrawImage(ctx, drawRect2, [UIImage imageNamed:@"Image 01.png"].CGImage);

// Create the new UIImage from the context
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

然而,生成的图像是每像素 32 位并且有一个 alpha 通道,所以当我使用 CGCreateImageWithMask 时它不起作用。我已经尝试创建一个位图上下文:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef ctx =CGBitmapContextCreate(nil, rectangleOfOverlap.size.width, rectangleOfOverlap.size.height, 8, rectangleOfOverlap.size.width , colorSpace, kCGImageAlphaNone);

UIGraphicsGetImageFromCurrentImageContext 返回零并且不创建结果图像。我在这里做一些愚蠢的事情吗?

任何帮助将不胜感激。

问候

戴夫

4

1 回答 1

0

好的,我想我有一个答案(或其中几个)......

如果上下文创建失败,那么控制台窗口会给出合理的错误消息并告诉您失败的原因。在这种情况下,上下文被创建,所以没有错误。

其次,CGBtimapContext 支持的参数列表在这里:http: //developer.apple.com/mac/library/qa/qa2001/qa1037.html

第三, UIGraphicsGetImageFromCurrentImageContext() 仅适用于使用 UIGraphicsBeginGraphicsContext() 创建的通用上下文,我需要使用:

UIImage *newImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(ctx)];

第四,如果我使用 NULL 作为第一个参数创建上下文,我无法使用 CGBitmapContextGetData(ctx) 获取底层像素数据,即使文档暗示从 10.3 开始为您处理内存。为了解决这个问题,我创建了一个名为:

- (CGContextRef) newGreyScaleBitmapContextOfSize:(CGSize) size;

该方法通过 malloc'ing 内存创建上下文并返回一个上下文引用。我不确定这是否全面,但由于我花了几天时间在这上面,我想我会让你知道我到目前为止所发现的。

希望这可以帮助,

戴夫

于 2010-04-29T06:34:26.067 回答