iOS,生成的图像和屏蔽

时间:2011-08-21 23:58:18

标签: ios ipad masking

我正在尝试生成一个菱形的图像,并显示一些完成与未完成的百分比。我实现这个的方式如下:

  • 生成2个矩形 - 一个是填充区域的大小,另一个是空矩形的大小
  • 使用我感兴趣的矩形大小调用 UIGrapicsBeginImageContext()
  • 在上下文中并排绘制2个矩形
  • 从上下文中抓取图像并结束上下文
  • 使用 CGImageMaskCreate(),然后使用 CGImageCreateWithMask()创建一个新的蒙版图像并提取蒙面图像

我使用UIImage的类别扩展生成填充和空位图,然后对它们应用静态蒙版图像。

问题:这在模拟器中运行良好,但屏蔽在真实设备上无效。

我没有在这里包含代码,而是包含一个指向具有代码的项目的链接。相关文件是:

  • UIImage.h / UIImage.m :UIImage的类别扩展,添加“使用指定颜色创建图像”和“使用提供的蒙版创建蒙版图像”。
  • TLRangeDisplay.h / TLRangeDisplay.m :我的菱形状态显示​​的代码。感兴趣的例程是 fillWithRect()

这是我添加到UIImage的代码(通过类别):

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

+ (UIImage *)imageWithColor:(UIColor *)color andSize:(CGSize)size {
    CGRect rect = CGRectMake(0.0f, 0.0f, size.height, size.width);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

- (UIImage*) maskWith:(UIImage *)maskImage {
    CGImageRef maskRef = maskImage.CGImage;
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false);
    CGImageRef masked = CGImageCreateWithMask([self CGImage], mask);
    UIImage* image = [UIImage imageWithCGImage:masked];
    CFRelease(mask);
    CFRelease(masked);
    return image;
}

以下是执行屏蔽的例程:

-(void)fillWithRect {
    CGRect f = self.frame;

    CGFloat width = f.size.width;
    CGFloat fullRange = maxValue_ - minValue_;
    CGFloat filledRange = currentValue_ - minValue_;

    CGRect fillRect = CGRectMake(0, 0, (filledRange * width) / fullRange, f.size.height);
    CGRect emptyRect = CGRectMake(fillRect.size.width, 0, width - fillRect.size.width, f.size.height);

    UIImage *fillImage = nil;
    UIImage *emptyImage = nil;

    if(fillRect.size.width > 0) {
        fillImage = [UIImage imageWithColor:fillColor_ andSize:fillRect.size];
    }
    if(emptyRect.size.width > 0) {
        emptyImage = [UIImage imageWithColor:emptyColor_ andSize:emptyRect.size];
    }

    // Build the 2-color image
    UIGraphicsBeginImageContext(f.size);

    [fillImage drawInRect:fillRect];
    [emptyImage drawInRect:emptyRect];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Mask it
    if(nil != maskImage_)
        image = [image maskWith:maskImage_];

    CGRect fullRect = CGRectMake(0, 0, f.size.width, f.size.height);

    // Merge ith with the shape
    UIGraphicsBeginImageContext(f.size);

    [image drawInRect:fullRect];
    [shapeImage_ drawInRect:fullRect];

    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [shownView_ removeFromSuperview];
    shownView_ = [[UIImageView alloc] initWithImage:image];

    [self addSubview:shownView_];

    if(nil != shownView_)
        [self bringSubviewToFront:shownView_];
}

该项目可以从http://dl.dropbox.com/u/5375467/ColorPlayOS4.zip

下载

感谢您对此问题的任何见解!

0 个答案:

没有答案