UIImageView로 이것을 할 수 있다는 것을 알고 있지만 UIImage로 할 수 있습니까? UIImageView의 애니메이션 이미지 배열 속성을 동일한 이미지의 배열이지만 다른 불투명도를 갖기를 원합니다. 생각?
답변:
이 작업을 수행해야했지만 Steven의 솔루션이 느릴 것이라고 생각했습니다. 이것은 그래픽 HW를 사용하기를 바랍니다. 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];
UIButton
. 정확히 필요한 것입니다.
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
}
}
쓰다:
let image = UIImage(named: "my_image")
let transparentImage = image.imageWithAlpha(0.5)
스위프트 3/4/5 :
이 구현은 선택적 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
}
}
쓰다:
let image = UIImage(named: "my_image")
let transparentImage = image?.image(alpha: 0.5)
Swift 3
버전을 선호합니다 .
훨씬 더 쉬운 해결책이 있습니다.
- (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;
}
setImage:withAlpha:
image:withAlpha:
좋을까요?
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);
Metal 렌더링을 실험하고 있고 첫 번째 응답에서 imageByApplyingAlpha에 의해 생성 된 CGImage를 추출하는 경우 예상보다 큰 Metal 렌더링으로 끝날 수 있습니다. Metal로 실험하는 동안 imageByApplyingAlpha에서 코드 한 줄을 변경할 수 있습니다.
UIGraphicsBeginImageContextWithOptions (self.size, NO, 1.0f);
// UIGraphicsBeginImageContextWithOptions (self.size, NO, 0.0f);
iPhone 11 Pro Max와 같이 배율이 3.0 인 기기를 사용하는 경우 위에 표시된 0.0 배율은 예상보다 3 배 더 큰 CGImage를 제공합니다. 배율을 1.0으로 변경하면 배율이 조정되지 않습니다.
바라건대,이 답변이 초보자들에게 많은 고통을 덜어 주길 바랍니다.