You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CILinearGradient创建线性渐变无显示,求问题排查

CILinearGradient无显示问题的修复方案

问题根源

  1. 渐变无明确渲染范围
    CILinearGradient生成的是无限延伸的渐变图像,Core Image无法确定需要渲染的区域大小,直接使用会导致输出图像没有有效尺寸,UIImageView无法识别显示。

  2. 未关联原始图像尺寸
    你的代码仅合成了两个渐变,但未将其与目标图像img的尺寸绑定,最终输出的渐变图像脱离了视图可识别的尺寸范围。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:53:17