使用CILinearGradient创建线性渐变无显示,求问题排查
CILinearGradient无显示问题的修复方案
问题根源
渐变无明确渲染范围
CILinearGradient生成的是无限延伸的渐变图像,Core Image无法确定需要渲染的区域大小,直接使用会导致输出图像没有有效尺寸,UIImageView无法识别显示。未关联原始图像尺寸
你的代码仅合成了两个渐变,但未将其与目标图像img的尺寸绑定,最终输出的渐变图像脱离了视图可识别的尺寸范围。CIImage转UIImage步骤缺失
直接将CIImage赋值给UIImageView时,若不指定正确的缩放比例和图像方向,系统可能无法正确解析图像的显示属性,导致无内容展示。
修复后的完整代码
// 假设img是你要处理的原始UIImage CIImage *originalCIImage = [CIImage imageWithCGImage:img.CGImage]; CGRect imageExtent = originalCIImage.extent; // 创建第一个渐变并裁剪到原始图像范围 CIFilter *gradientfilter = [CIFilter filterWithName:@"CILinearGradient"]; [gradientfilter setValue:[CIVector vectorWithX:CGRectGetMidX(imageExtent) Y:CGRectGetMaxY(imageExtent)*0.75] forKey:@"inputPoint0"]; [gradientfilter setValue:[CIColor colorWithRed:0 green:1 blue:0 alpha:1] forKey:@"inputColor0"]; [gradientfilter setValue:[CIVector vectorWithX:CGRectGetMidX(imageExtent) Y:CGRectGetMaxY(imageExtent)*0.5] forKey:@"inputPoint1"]; [gradientfilter setValue:[CIColor colorWithRed:0 green:1 blue:0 alpha:0] forKey:@"inputColor1"]; CIFilter *cropFilter1 = [CIFilter filterWithName:@"CICrop"]; [cropFilter1 setValue:gradientfilter.outputImage forKey:kCIInputImageKey]; [cropFilter1 setValue:[CIVector vectorWithCGRect:imageExtent] forKey:@"inputRectangle"]; CIImage *croppedGradient1 = cropFilter1.outputImage; // 创建第二个渐变并裁剪到原始图像范围 CIFilter *gradientfilter2 = [CIFilter filterWithName:@"CILinearGradient"]; [gradientfilter2 setValue:[CIVector vectorWithX:CGRectGetMidX(imageExtent) Y:CGRectGetMaxY(imageExtent)*0.25] forKey:@"inputPoint0"]; [gradientfilter2 setValue:[CIColor colorWithRed:0 green:1 blue:0 alpha:1] forKey:@"inputColor0"]; [gradientfilter2 setValue:[CIVector vectorWithX:CGRectGetMidX(imageExtent) Y:CGRectGetMaxY(imageExtent)*0.5] forKey:@"inputPoint1"]; [gradientfilter2 setValue:[CIColor colorWithRed:0 green:1 blue:0 alpha:0] forKey:@"inputColor1"]; CIFilter *cropFilter2 = [CIFilter filterWithName:@"CICrop"]; [cropFilter2 setValue:gradientfilter2.outputImage forKey:kCIInputImageKey]; [cropFilter2 setValue:[CIVector vectorWithCGRect:imageExtent] forKey:@"inputRectangle"]; CIImage *croppedGradient2 = cropFilter2.outputImage; // 合成两个渐变 CIFilter *compositingFilter = [CIFilter filterWithName:@"CIAdditionCompositing"]; [compositingFilter setValue:croppedGradient1 forKey:kCIInputImageKey]; [compositingFilter setValue:croppedGradient2 forKey:kCIInputBackgroundImageKey]; CIImage *combinedGradient = compositingFilter.outputImage; // 将渐变与原始图像叠加(若不需要保留原始图像可跳过此步骤) CIFilter *finalCompositing = [CIFilter filterWithName:@"CISourceOverCompositing"]; [finalCompositing setValue:combinedGradient forKey:kCIInputImageKey]; [finalCompositing setValue:originalCIImage forKey:kCIInputBackgroundImageKey]; CIImage *outImage = finalCompositing.outputImage; // 转换为UIImage并设置到imageView UIImage *resultImage = [UIImage imageWithCIImage:outImage scale:[UIScreen mainScreen].scale orientation:img.imageOrientation]; self.imageView.image = resultImage;
关键修复点说明
- 用
CICrop滤镜将渐变裁剪到原始图像的extent范围,确保图像有明确的可识别尺寸。 - 若仅需要展示渐变效果,可跳过与原始图像叠加的步骤,直接将裁剪后的渐变转换为UIImage。
- 转换UIImage时指定屏幕缩放比例和原始图像方向,保证图像显示清晰且方向正确。
内容的提问来源于stack exchange,提问作者GeraldTheGerm
相关产品推荐
相关产品推荐

