如何设置UIImage的不透明度/ alpha?

Mar*_*rty 79 alpha opacity uiimageview uiimage ios

我知道你可以用UIImageView做到这一点,但它可以用于UIImage吗?我想让UIImageView的动画图像数组属性成为同一图像但具有不同不透明度的数组.思考?

Nic*_*247 118

我只需要这样做,但认为史蒂文的解决方案会很慢.这应该有希望使用图形硬件.在UIImage上创建一个类别:

- (UIImage *)imageByApplyingAlpha:(CGFloat) alpha {
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGRect area = CGRectMake(0, 0, self.size.width, self.size.height);

    CGContextScaleCTM(ctx, 1, -1);
    CGContextTranslateCTM(ctx, 0, -area.size.height);

    CGContextSetBlendMode(ctx, kCGBlendModeMultiply);

    CGContextSetAlpha(ctx, alpha);

    CGContextDrawImage(ctx, area, self.CGImage);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;
}
Run Code Online (Sandbox Code Playgroud)

  • 工作得很好,非常感谢.对于围绕iOS开发的物流的其他新手,这里是为UIImage制作类别的步骤.1.右键单击项目主管,然后选择"新建文件".2.在出现的屏幕中,选择Objective-C类别文件类型.3.在.m文件中添加答案的代码,并在.h文件中添加方法的声明.4.在使用图像透明的文件中,#import该文件.5.在UIImage的实例上使用imageByApplyingAlpha方法. (6认同)
  • 甚至不记得为什么我需要这个:) (3认同)

Mat*_*art 78

设置其显示的视图的不透明度.

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"SomeName.png"]];
imageView.alpha = 0.5; //Alpha runs from 0.0 to 1.0
Run Code Online (Sandbox Code Playgroud)

在动画中使用它.您可以在动画中更改持续时间的Alpha.

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
//Set alpha
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

  • 这仅在开发人员使用UIImageView时才有效.问题清楚地表明情况并非如此. (3认同)

Dev*_*n B 45

根据Alexey Ishkov的回答,但在Swift中

我使用了UIImage类的扩展.

斯威夫特2:

UIImage扩展:

extension UIImage {
    func imageWithAlpha(alpha: CGFloat) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        drawAtPoint(CGPointZero, blendMode: .Normal, alpha: alpha)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

let image = UIImage(named: "my_image")
let transparentImage = image.imageWithAlpha(0.5)
Run Code Online (Sandbox Code Playgroud)

Swift 3/Swift 4:

请注意,此实现返回可选的UIImage.这是因为在Swift 3中UIGraphicsGetImageFromCurrentImageContext现在返回一个可选项.如果上下文为nil或未创建的值,则此值可以为nil UIGraphicsBeginImageContext.

UIImage扩展:

extension UIImage {
    func image(alpha: CGFloat) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        draw(at: .zero, blendMode: .normal, alpha: alpha)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

let image = UIImage(named: "my_image")
let transparentImage = image?.image(alpha: 0.5)
Run Code Online (Sandbox Code Playgroud)


小智 16

有更简单的解决方案:

- (UIImage *)tranlucentWithAlpha:(CGFloat)alpha
{
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    [self drawAtPoint:CGPointZero blendMode:kCGBlendModeNormal alpha:alpha];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
Run Code Online (Sandbox Code Playgroud)

  • 可能应该是公认的答案。获得结果的最快/最有效的方法 (2认同)

Nic*_*sky 5

嘿嘿,感谢 Xamarin 用户!:) 这里它被翻译成 c#

//***************************************************************************
public static class ImageExtensions
//***************************************************************************
{
    //-------------------------------------------------------------
    public static UIImage WithAlpha(this UIImage image, float alpha)  
    //-------------------------------------------------------------
        {
        UIGraphics.BeginImageContextWithOptions(image.Size,false,image.CurrentScale);
        image.Draw(CGPoint.Empty, CGBlendMode.Normal, alpha);
        var newImage = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();
        return newImage;
        }

}
Run Code Online (Sandbox Code Playgroud)

用法示例:

var MySupaImage = UIImage.FromBundle("opaquestuff.png").WithAlpha(0.15f);
Run Code Online (Sandbox Code Playgroud)