Как установить непрозрачность / Альфа UIImage?
Я знаю, что вы можете сделать это с помощью UIImageView, но можно ли это сделать с UIImage? Я хочу, чтобы свойство массива анимационных изображений UIImageView было массивом одного и того же изображения, но с разными непрозрачностями. Мысли?
6 ответов:
Мне просто нужно было это сделать, но я думал, что решение Стивена будет медленным. Мы надеемся, что использование графики ГВ. Создайте категорию на 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; }
установите непрозрачность его вида, в котором он показан.
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"SomeName.png"]]; imageView.alpha = 0.5; //Alpha runs from 0.0 to 1.0
используйте это в анимации. Вы можете изменить Альфа в анимации на время.
[UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:1.0]; //Set alpha [UIView commitAnimations];
основываясь на ответе Алексея Ишкова, но в Swift
я использовал расширение класса UIImage.
Swift 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 } }
использование:
let image = UIImage(named: "my_image") let transparentImage = image.imageWithAlpha(0.5)
Swift 3 / Swift 4:
обратите внимание, что эта реализация возвращает необязательный UIImage. Это потому, что в Swift 3
UIGraphicsGetImageFromCurrentImageContext
теперь возвращает необязательный. Это значение может быть равно нулю, если контекст равен нулю или что не создано с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 } }
использование:
let image = UIImage(named: "my_image") let transparentImage = image?.image(alpha: 0.5)
есть гораздо более простое решение:
- (UIImage *)tranlucentWithAlpha:(CGFloat)alpha { UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); [self drawAtPoint:CGPointZero blendMode:kCGBlendModeNormal alpha:alpha]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }
Я понимаю, что это довольно поздно, но мне нужно было что-то вроде этого, поэтому я взялся за быстрый и грязный метод, чтобы сделать это.
+ (UIImage *) image:(UIImage *)image withAlpha:(CGFloat)alpha{ // Create a pixel buffer in an easy to use format CGImageRef imageRef = [image CGImage]; NSUInteger width = CGImageGetWidth(imageRef); NSUInteger height = CGImageGetHeight(imageRef); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); UInt8 * m_PixelBuf = malloc(sizeof(UInt8) * height * width * 4); NSUInteger bytesPerPixel = 4; NSUInteger bytesPerRow = bytesPerPixel * width; NSUInteger bitsPerComponent = 8; CGContextRef context = CGBitmapContextCreate(m_PixelBuf, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); CGContextRelease(context); //alter the alpha int length = height * width * 4; for (int i=0; i<length; i+=4) { m_PixelBuf[i+3] = 255*alpha; } //create a new image CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGImageRef newImgRef = CGBitmapContextCreateImage(ctx); CGColorSpaceRelease(colorSpace); CGContextRelease(ctx); free(m_PixelBuf); UIImage *finalImage = [UIImage imageWithCGImage:newImgRef]; CGImageRelease(newImgRef); return finalImage; }
Эй эй Спасибо от пользователя 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; } }
пример использования:
var MySupaImage = UIImage.FromBundle("opaquestuff.png").WithAlpha(0.15f);