没有透明部分的图像掩膜

问题描述:

我一直在调查这一段时间。没有透明部分的图像掩膜

我试图把一个灰度图像在杯

enter image description here

我目前的伸展与UIImageView的灰色背景的滑块已经量。

-(void) sliderChanged:(CGFloat) value{ 
drinksView.grayArea.frame = CGRectMake(0 , -value ,372 ,value); 

我知道这是很肮脏的,不是我想要的......

什么,我想要的是灰色部分仅涵盖那里是一个杯的部分(例如,部分地方的图像不透明)。杯子的图像只有透明背景

有没有人有如何实现这个想法?我是一个带面具的小菜鸟,许多教程让我无处可去,我甚至不知道它是否可能。

PS:周围绘制杯的路径是不可能的,因为杯子图像可以换到玻璃

我能想到的就是用一个蒙面的CALayer最简单的方法。这就是你需要做什么:

  1. 而不是使用一个UIImageView的,使用CALayer与灰色背景为您的覆盖。您的sliderChanged:方法将保持不变,但drinksView.grayArea将是一个图层而不是视图。
  2. 到目前为止效果与以前完全一样。现在,你需要设置grayArea的面具。请执行以下操作:

    CALayer * maskLayer = [CALayer new]; 
    maskLayer.contents = myCupImage.CGImage; 
    grayArea.mask = maskLayer; 
    
  3. 我认为默认情况下,图层会随着比例尺的变化而拉伸内容。我们不希望这样。您可以通过将图层的contentsGravity设置为kCAGravityTop来解决此问题。

这应该做你想做的。

一个警告:我不太确定掩码如何应对改变内容重力。如果有在这一方面的问题,可以通过将容器固定层它:

  1. 设置grayArea固定帧(等于杯图像的尺寸)。

  2. 代替直接加入grayArea的,因为它引入一个容器层:

    CALayer * container = [CALayer new]; 
    container.masksToBounds = YES; 
    [container addSublayer:grayArea]; 
    [drinksView.layer addSublayer:container]; 
    
  3. 在你sliderChanged:,更改的container代替grayArea帧。

希望这项工作。

+0

这工作就像一个魅力,我会在底部cuz它后我的最终代码确实需要一些增强。 Ty非常感谢 – SnK 2012-04-02 13:21:07

首先,你需要熟悉这种方法的

// masks the item based on the MaskImage 
- (UIImage*) itemMask : (UIImage*)image withMask:(UIImage*)maskImage 
{ 
    UIImage* afterMasking = nil; 

    CGImageRef maskRef = maskImage.CGImage; 

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 
    CFRelease(mask); 
    afterMasking = [UIImage imageWithCGImage:masked]; 
    CFRelease(masked); 
    return afterMasking; 
} 

,做什么是你将它的杯子图像和面具图像一起喂它,它会掩盖你的杯子图像。它只会掩盖你的杯子形象,没有什么在下面,所以你不必担心。

您遇到的问题是灰框调整大小。我如何处理这个问题是根据滑块值裁剪蒙版。所以制作一个黑盒子,然后改变它的大小,在你通过该方法喂食之前如何处理grayBG。这应该很快这样做,所以我不会详细说明,但最后你会有这样的事情。请原谅半阐述图形

Image With large sliderImage With small slider

+0

由于第一次的答案为我工作,我没有尝试这种(固定价格项目;))谢谢你的努力反正 – SnK 2012-04-02 13:22:39

drinksView.grayLayer = [CALayer new]; 
    drinksView.grayLayer.frame = CGRectMake(0, 0, 372, 0); 
    drinksView.grayLayer.contentsGravity = kCAGravityTop; 

    CALayer * topLayer = [CALayer new]; 
    topLayer.frame = CGRectMake(0, 0, 372, 367); 
    UIImage * grayImage = [UIImage imageNamed:@"grayDrink.png"]; 
    topLayer.contents = (id) grayImage.CGImage; 

    CALayer * maskLayer = [CALayer new]; 
    maskLayer.contents = (id)cupImage.CGImage; 
    maskLayer.masksToBounds = YES; 

    maskLayer.bounds = CGRectMake(0, 0, 372, 367); 
    maskLayer.position = CGPointMake(186,184); 

    [topLayer setMask:maskLayer]; 
    [drinksView.grayLayer addSublayer:topLayer]; 
    [drinksView.grayLayer setMasksToBounds:YES]; 
    [[drinksView layer]addSublayer:drinksView.grayLayer];