核心图形效果:适用于模拟器,但不适用于设备

时间:2011-12-09 19:32:33

标签: objective-c ipad ios5 core-graphics core-image

我使用Core Graphics完成了简单但有效的浮雕效果。 它很棒!但只在模拟器中...... 结果如下:

1st image

我所做的是以下内容: - 从拾取的图像中,如果有的话,我会取出alpha,然后用白色填充它。 - 我将这个RGB图像转换为灰度图像 - 我反转了这张图片的颜色

然后我调用自定义方法来创建带参数的效果:

  • canvasImg:要在
  • 上屏蔽的半透明图像
  • maskImg:我刚刚创建的图像,灰度和倒置:

2nd image

  • opacitity:结果图像的不透明度

然后该方法制作一个简单的蒙版,应用阴影和不透明度并返回一个全新的UIImage。 我无法理解为什么在模拟器中它可以工作,也不能理解设备。 在设备中运行时,我获得了一个非null的UIImage ... 请帮忙!

以下是代码:

- (UIImage *)stampImage:(UIImage *)canvasImg withMask:(UIImage *)maskImg withOpacity:(CGFloat)opacity
{
//Creating the mask Image
CGContextRef mainViewContentContext;
CGColorSpaceRef colorSpace;
colorSpace = CGColorSpaceCreateDeviceRGB();
mainViewContentContext = CGBitmapContextCreate(NULL, maskImg.size.width, maskImg.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);

if (mainViewContentContext == NULL) return NULL;

CGContextClipToMask(mainViewContentContext, CGRectMake(0, 0, maskImg.size.width, maskImg.size.height), maskImg.CGImage);
CGContextDrawImage(mainViewContentContext, CGRectMake(0, 0, maskImg.size.width, maskImg.size.height), canvasImg.CGImage);
CGContextSetAllowsAntialiasing(mainViewContentContext, true);
CGContextSetShouldAntialias(mainViewContentContext, true);
CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext);
CGContextRelease(mainViewContentContext);
UIImage *maskedImage = [UIImage imageWithCGImage:mainViewContentBitmapContext];
CGImageRelease(mainViewContentBitmapContext);

//Giving some Drop shadows
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef shadowContext = CGBitmapContextCreate(NULL, maskedImage.size.width + 10, maskedImage.size.height + 10,
                                                   CGImageGetBitsPerComponent(maskedImage.CGImage), 0, 
                                                   colourSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colourSpace);
CGContextSetShadowWithColor(shadowContext, CGSizeMake(0, -1), 1, [UIColor colorWithWhite:1.0 alpha:0.3].CGColor);
CGContextSetAllowsAntialiasing(shadowContext, true);
CGContextSetShouldAntialias(shadowContext, true);
CGContextDrawImage(shadowContext, CGRectMake(0, 10, maskedImage.size.width, maskedImage.size.height), maskedImage.CGImage);
CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext);
CGContextRelease(shadowContext);

UIImage *stampImg = [UIImage imageWithCGImage:shadowedCGImage];
CGImageRelease(shadowedCGImage);

return stampImg;

}

1 个答案:

答案 0 :(得分:1)

还要注意设备与模拟器的内存限制。我有CG逻辑,可以在模拟器上构建并运行良好;相同的逻辑将构建并运行在设备上没有发出错误,但视觉结果不是所需的。我建议在一个相当小的图像上尝试你的逻辑,以验证它在设备上是否有效。我不得不放弃一些我想出的非常酷的图像掩盖内容,因为设备没有马力可以将其拉出以获得更大的图像。