- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用来自这个问题的 Dondragmer 的“旋转色调”示例中的代码: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;
}
我的问题:
最佳答案
我在尝试更新 CIImage
的亮度时遇到了类似的问题。问题在于 CoreImage
在 RGB
空间中工作,修改色调、饱和度或亮度应该在 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
转换,您可能会获得更好的性能,如果您尝试每秒多次执行此过滤器,您将看到性能下降,但这是我最好的建议,我找不到使用 CoreImage
在 HSV
空间中修改色相、饱和度或亮度的方法。
更新:正如@dfd 在评论中提到的,您还可以为执行这些计算的过滤器编写自定义内核,这样会快得多,但您需要谷歌如何转换RGB 到 HSV 并返回。
关于ios - CoreImage CIHueAdjust 滤镜给出错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47916988/
我创建了如下模糊图像: //Blur the UIImage CIImage *imageToBlur = [CIImage imageWithCGImage:viewImage.CGImage];
我目前正在探索 Apple 的 Core Image 框架中的人脸检测功能。 现在,我正在玩 Apple 的示例项目,该项目将红色方 block 放在人的脸上。 ( https://developer
我有来自 AVAsset 的 CVPixelBufferRef。我正在尝试对其应用 CIFilter。我使用这些行: CVPixelBufferRef pixelBuffer = ... CVPixe
我刚刚在 iOS 5 上查看了 CoreImage 框架,发现可以很容易地为整个图像添加效果。我想知道是否可以对图像的特殊部分(矩形)添加效果。例如在部分图像上添加灰度效果/ 期待您的帮助。 谢谢,辉
我在 IOS 上使用 CoreImage 来检测图像中的人脸。当有多个面孔时它工作正常,但不适用于像这样的简单面孔: 人脸真的很大很明显,但是CoreImage检测不到。我想这可能是因为我的 kCGI
我正在使用以下代码从图像中删除绿色背景。但是图像的边缘有绿色色调并且一些像素已损坏。我如何平滑它并使剪切完美。 func chromaKeyFilter(fromHue: CGFloat, toHu
对于那些不熟悉 Core Image 的人,这里有一个很好的描述: http://developer.apple.com/macosx/coreimage.html 是否有与 Apple 的 Core
我正在开发一个 cocoa 应用程序。我使用 CIFilter 和 CIImage 在 NSImage 中应用核心概念。 所以我需要导入CoreImage.framework。但我没有在我的开发人员库
想象一下,你有几百张方形图片,比如专辑封面 一些有白色边框 注意 10px 左右的边框。 我正要写一些简单的光栅代码来检测和删除这样的边界——简单地说,用灰色填充它们。 但是:这可以以某种方式通过核心
我想使用 coreImage 框架检测 UIImage 是否模糊 最佳答案 尝试使用 OpenCV 功能。 http://answers.opencv.org/question/34481/ios-l
我正在尝试使用 CoreImage CIFeature 来检测面部表情,因为这些是 native API。我创建了一个示例 View Controller 项目并更新了相关代码。当我启动这个 iOS
核心图像不起作用: let fileUrl = Bundle.main.url(forResource: "image", withExtension: "png") let bega
我已经创建了我认为应该是合适的灰度 CIFilter,使用针对白色调整的 CIColorMonochromeFilter。这对我来说看起来很灰度,但我也不是专家,所以我只是想知道这是否是灰度过滤器的准
在内核例程规则的文档中,它说“内核例程通过使用反向映射回输入图像的相应像素来计算输出像素。尽管您可以用这种方式表达大多数像素计算(有些比其他更自然),但对于某些图像处理操作来说,即使不是不可能,也是很
我在图像上尝试 CIColorClamp,它应该只将像素保持在指定范围内 (https://developer.apple.com/library/archive/documentation/Grap
我正在编写一个 iOS,我需要能够在图像中进行边缘检测。我实际上想要类似于 Photoshop 的跟踪轮廓的东西。因为我基本上需要得到最简单的一组线来工作。事情是我似乎无法弄清楚如何去做,坦率地说,我
我正在构建一个 iOS 应用程序来执行一些基本检测。我从 AVCaptureVideoDataOutput 获取原始帧,将 CMSampleBufferRef 转换为 UIImage,调整 UIIma
我终于坐下来将我们的一些图形库转换为使用 CoreImage 来渲染图像(用于混合两个图像之类的事情)并且我已经开始工作但速度很慢(iOS5.01 iPhone 4S)。我认为 CoreImage 的
是否存在可用作平滑阈值的现有过滤器?我的意思是像素值应该在两个值之间设置阈值,但中间值是插值的。 基本上,我正在尝试实现这个: https://www.filterforge.com/wiki/ind
我正在使用来自这个问题的 Dondragmer 的“旋转色调”示例中的代码:How to programmatically change the hue of UIImage? 但是,我得到的结果与我
我是一名优秀的程序员,十分优秀!