我使用以下方法从文件系统中获取解压缩的uiimage。但是,当我打开颜色混合图层时,即使UIImageView设置为不透明,UIImageView也会显示为红色。
文件系统上的图像没有Alpha通道。我尝试设置CGContextSetAlpha(bitmapContext,1),但仍然有混合层。
任何人都知道在使用CGContextDrawImage时如何删除Alpha通道?
- (UIImage *)decompressedImage
{
CGImageRef imageRef = self.CGImage;
CGRect rect = CGRectMake(0.f, 0.f, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef));
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
rect.size.width,
rect.size.height,
CGImageGetBitsPerComponent(imageRef),
CGImageGetBytesPerRow(imageRef),
CGImageGetColorSpace(imageRef),
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little
);
// kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little are the bit flags required
// so that the main thread doesn't have any conversions to do.
CGContextDrawImage(bitmapContext, rect, imageRef);
CGImageRef decompressedImageRef = CGBitmapContextCreateImage(bitmapContext);
UIImage* decompressedImage = [UIImage imageWithCGImage:decompressedImageRef
scale:[[UIScreen mainScreen] scale]
orientation:UIImageOrientationUp];
CGImageRelease(decompressedImageRef);
CGContextRelease(bitmapContext);
return decompressedImage;
}
答案 0 :(得分:5)
在上下文的选项中,尝试选项
kCGImageAlphaNoneSkipLast
或
kCGImageAlphaNoneSkipFirst
取决于您使用的是RGBA还是ARGB
即
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
rect.size.width,
rect.size.height,
CGImageGetBitsPerComponent(imageRef),
CGImageGetBytesPerRow(imageRef),
CGImageGetColorSpace(imageRef),
kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Little
);
答案 1 :(得分:1)
结果相同,但代码更少,无需担心:
func removeAlpha(from inputImage: UIImage) -> UIImage {
let format = UIGraphicsImageRendererFormat.init()
format.opaque = true //Removes Alpha Channel
format.scale = inputImage.scale //Keeps original image scale.
let size = inputImage.size
return UIGraphicsImageRenderer(size: size, format: format).image { _ in
inputImage.draw(in: CGRect(origin: .zero, size: size))
}
}
答案 2 :(得分:0)
这是@Justin Ganzer 的答案,采用了一种很好的可链接性扩展格式。
@available(iOS 10.0, *)
extension UIImage {
func removingAlpha() -> UIImage {
let format = UIGraphicsImageRendererFormat()
format.opaque = true // removes Alpha Channel
format.scale = scale // keeps original image scale
return UIGraphicsImageRenderer(size: size, format: format).image { _ in
draw(in: CGRect(origin: .zero, size: size))
}
}
}
答案 3 :(得分:-7)
-(void)JhagRemoveMethodRepet
{
switch (Jhagtag)
{
case 1:
{
if (jhag1.alpha>0.3)
{
float alpha1;
alpha1=jhag1.alpha;
jhag1.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:0 withObject:@"Mid"];
}else
{
jhag1.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:0 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 2:
{
if (jhag2.alpha>0.3)
{
float alpha1;
alpha1=jhag2.alpha;
jhag2.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:1 withObject:@"Mid"];
if (jhagBrush==YES)
{
BTooth2.alpha=0.0;
}
}else
{
jhag2.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:1 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 3:
{
if (jhag3.alpha>0.3)
{
float alpha1;
alpha1=jhag3.alpha;
jhag3.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:2 withObject:@"Mid"];
}else
{
jhag3.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:2 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 4:
{
if (jhag4.alpha>0.3)
{
float alpha1;
alpha1=jhag4.alpha;
jhag4.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:3 withObject:@"Mid"];
if (jhagBrush==YES)
{
BTooth3.alpha=0.0;
SpiderMud.alpha=0.0;
}
}else
{
jhag4.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:3 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 5:
{
if (jhag5.alpha>0.3)
{
float alpha1;
alpha1=jhag5.alpha;
jhag5.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:4 withObject:@"Mid"];
}else
{
jhag5.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:4 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 6:
{
if (jhag6.alpha>0.3)
{
float alpha1;
alpha1=jhag6.alpha;
jhag6.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:5 withObject:@"Mid"];
if (jhagBrush==YES)
{
GreenMud.alpha=0.0;
}
}else
{
jhag6.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:5 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 7:
{
if (jhag7.alpha>0.3)
{
float alpha1;
alpha1=jhag7.alpha;
jhag7.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:6 withObject:@"Mid"];
}else
{
jhag7.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:6 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 8:
{
if (jhag8.alpha>0.3)
{
float alpha1;
alpha1=jhag8.alpha;
jhag8.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:7 withObject:@"Mid"];
if (jhagBrush==YES)
{
BTooth1.alpha=0.0;
}
}else
{
jhag8.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:7 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 9:
{
if (jhag9.alpha>0.3)
{
float alpha1;
alpha1=jhag9.alpha;
jhag9.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:8 withObject:@"Mid"];
}
else
{
jhag9.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:8 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 10:
{
if (jhag10.alpha>0.3)
{
float alpha1;
alpha1=jhag10.alpha;
jhag10.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:9 withObject:@"Mid"];
}else
{
jhag10.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:9 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
case 11:
{
if (jhag11.alpha>0.3)
{
float alpha1;
alpha1=jhag11.alpha;
jhag11.alpha=alpha1-0.1;
[Checkjhag replaceObjectAtIndex:10 withObject:@"Mid"];
if (jhagBrush==YES)
{
Yellowmud.alpha=0.0;
}
}else
{
jhag11.alpha=0.0;
[JRemovetimer invalidate];
JRemovetimer=nil;
[Checkjhag replaceObjectAtIndex:10 withObject:@"No"];
[self checkcompeletewater];
}
}
break;
default:
break;
}
}
-(void)checkcompeletewater
{
NSMutableArray *compeletearr=[NSMutableArray arrayWithObjects:@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No",@"No", nil];
if ([Checkjhag isEqualToArray:compeletearr] && jhagBrush==YES)
{
waterClean=YES;
[self SoundPlay:@"puzzle_right"];