我正在使用Dondragmer的“Rotated Hue”示例中的代码来解决这个问题:How to programmatically change the hue of UIImage?
然而,我得到的结果与我预期的非常不同。我希望色调的变化给予类似的结果,改变色调在Photoshop中,但变化是不是在所有相似。
为了说明,使用此源图像:
Photoshop中的pi/4旋转给出:
使用Dondragmer的代码,我得到:
同样,在Photoshop中旋转180度可以得到:
但是CIHueAdjust过滤器产生:
我的代码:
- (CGImageRef)changeHueOfImage(CGImageRef)source By:(NSInteger)angle
{
CIImage *image = [CIImage imageWithCGImage:source];
// Convert degrees to radians
CGFloat angleRadians = GLKMathDegreesToRadians(angle);
// Use the Core Image CIHueAdjust filter to change the hue
CIFilter *hueFilter = [CIFilter filterWithName:@"CIHueAdjust"];
[hueFilter setDefaults];
[hueFilter setValue:image forKey:@"inputImage"];
[hueFilter setValue:[NSNumber numberWithFloat:angleRadians] forKey:@"inputAngle"];
image = [hueFilter outputImage];
// Save the modified image
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef result = [context createCGImage:image fromRect:[image extent]];
return result;
}
我的问题:
1.我是否误解了CIHueAdjust过滤器的作用?
1.我是否需要考虑如何将亮度和饱和度因素纳入过滤器?
1.如何复制Photoshop行为
1.总的来说,为什么结果如此不同?
3条答案
按热度按时间0mkxixxg1#
我在试图更新
CIImage
的亮度时遇到了类似的问题。问题是CoreImage
在RGB
空间中工作,修改色调,饱和度或亮度应该在HSV
空间中完成。最后我用here这个代码片段来操作每个像素。可能有更好的方法,但我用每个像素的
RGB
值创建了一个UIColor
,从该颜色中获取HSV
值,更新了我想要更新的组件,创建了一个新的UIColor并使用该颜色的RGB
值来修改图像。**注意:**我没有写这段代码,I found it here,并粘贴在这里,以防要点被删除。All credit to bjorndagerman@github
如果你自己实现
RGB -> HSV -> RGB
转换,你可能会得到更好的性能,如果你试图每秒多次执行这个过滤器,你会看到性能下降,但这是我最好的建议,我找不到一种方法来修改色调,饱和度或亮度在HSV
空间与CoreImage
。更新:正如@dfd在评论中提到的,你也可以为一个过滤器编写一个自定义内核来进行这些计算,这会快得多,但你需要谷歌如何将RGB转换为HSV并返回。
fkaflof62#
我从来没有找到我的问题的答案:为什么CIHueAdjust没有给予预期的结果。但我确实找到了替代代码,它给了我想要的结果:
我对这个解决方案并不满意;特别地,几乎可以肯定的是,存在比依赖于为每个像素生成新的
UIColor
更有效的东西。但它会像预期的那样转移图像的色调。vc9ivgsu3#
色调的输入参数以弧度表示。
下面的代码允许您输入一个从0. 0到1. 0的浮点数,表示0到360度。
用法