gpt4 book ai didi

ios - CoreImage CIHueAdjust 滤镜给出错误的颜色

转载 作者:可可西里 更新时间:2023-11-01 05:42:53 26 4
gpt4 key购买 nike

我正在使用来自这个问题的 Dondragmer 的“旋转色调”示例中的代码:How to programmatically change the hue of UIImage?

但是,我得到的结果与我的预期截然不同。我希望色相变化会产生与在 Photoshop 中改变色相类似的结果,但这些变化根本不相似。

为了说明,使用这个源图像:

source image

Photoshop 中的 pi/4 旋转给出了这个:

45 degree rotation Photoshop

使用 Dondragmer 的代码我得到:

45 degree rotation CIHueAdjust

同样,在 Photoshop 中旋转 180 度会得到:

180 degree rotation Photoshop

但是 CIHueAdjust 过滤器会产生:

180 degree rotation 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 过滤器的作用?
  2. 我是否需要考虑亮度和饱和度如何影响滤镜?
  3. 如何复制 Photoshop 行为
  4. 一般来说,为什么结果如此不同?

最佳答案

我在尝试更新 CIImage 的亮度时遇到了类似的问题。问题在于 CoreImageRGB 空间中工作,修改色调、饱和度或亮度应该在 HSV 空间中完成。

我最终做的是使用我发现的这个片段 here操纵每个像素。可能有更好的方法,但我使用每个像素的 RGB 值创建了一个 UIColor,从该颜色获取了 HSV 值,更新了组件我想更新,创建一个新的 UIColor 并使用该颜色的 RGB 值来修改图像。

CGImageRef imageRef = [img CGImage];
uint width = CGImageGetWidth(imageRef);
uint height = CGImageGetHeight(imageRef);
unsigned char *pixels = malloc(height*width*4); //1d array with size for every pixel. Each pixel has the components: Red,Green,Blue,Alpha

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, 4*width, colorSpaceRef, kCGImageAlphaPremultipliedLast); //our quartz2d drawing env
CGColorSpaceRelease(colorSpaceRef);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

for (int y=0;y<height;++y){
for (int x=0;x<width;++x){
int idx = (width*y+x)*4; //the index of pixel(x,y) in the 1d array pixels

//Pixel manipulation here

//red = pixels[idx]
//green = piexls[idx+1]
//blue = pixels[idx+2]
//alpha = pixels[idx+3]

//pixels[idx] = NEW_RED_VALUE

//Please note that this assumes an image format with alpha stored in the least significant bit.
//See kCGImageAlphaPremultipliedLast for more info.
//Change if needed and also update bitmapInfo provided to CGBitmapContextCreate
}
}


imageRef = CGBitmapContextCreateImage(context);
CGContextRelease(context);
free(pixels);

//load our new image
UIImage* newImg = [UIImage imageWithCGImage:imageRef];

注意:这段代码不是我写的,I found it here并粘贴在这里以防要点被删除。 All credit to bjorndagerman@github

如果您自己实现 RGB -> HSV -> RGB 转换,您可能会获得更好的性能,如果您尝试每秒多次执行此过滤器,您将看到性能下降,但这是我最好的建议,我找不到使用 CoreImageHSV 空间中修改色相、饱和度或亮度的方法。

更新:正如@dfd 在评论中提到的,您还可以为执行这些计算的过滤器编写自定义内核,这样会快得多,但您需要谷歌如何转换RGB 到 HSV 并返回。

关于ios - CoreImage CIHueAdjust 滤镜给出错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47916988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com