iPhone 上的色彩平衡

2024-03-17

我正在拍摄一张图像,通过屏幕上下文加载它,并逐像素地更改它。我有许多不同的滤镜应用于图像,但我需要做的最后一件事是改变色彩平衡(类似于 Photoshop)以使红色更加青色。

下面的代码显示了我如何拍摄图像、获取数据以及逐像素检查 r/g/b 值:

CGImageRef sourceImage = theImage.image.CGImage;

CFDataRef theData;
theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));

UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData);

int dataLength = CFDataGetLength(theData);


int red = 0;
int green = 1;
int blue = 2;


for (int index = 0; index < dataLength; index += 4) {

    int r = pixelData[index + red];
    int g = pixelData[index + green];
    int b = pixelData[index + blue];

    // the color balancing would go here...

    if (r < 0) r = 0;
    if (g < 0) g = 0;
    if (b < 0) b = 0;

    if (r > 255) r = 255;
    if (g > 255) g = 255;
    if (b > 255) b = 255;

    pixelData[index + red] = r;
    pixelData[index + green] = g;
    pixelData[index + blue] = b;

}



CGContextRef context;
context = CGBitmapContextCreate(pixelData,
                                CGImageGetWidth(sourceImage),
                                CGImageGetHeight(sourceImage),
                                8,
                                CGImageGetBytesPerRow(sourceImage),
                                CGImageGetColorSpace(sourceImage),
                                kCGImageAlphaPremultipliedLast);

CGImageRef newCGImage = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newCGImage];

CGContextRelease(context);
CFRelease(theData);
CGImageRelease(newCGImage);

theImage.image = newImage;

我正在对像素数据执行许多其他操作(设置级别、去饱和),但我需要将红色值转向青色。

在 Photoshop 中,我可以通过以下方式做到这一点:

图像:调整:色彩平衡 并将其设置为-30 0 0

我无法找到解释如何执行此颜色偏移的算法或示例。我尝试从每个红色值中减去 30,或者将硬最大值设置为 255 - 30 (225),但这些似乎会剪切颜色而不改变值......现在,我只是在研究它,但是指向参考的指针会有很大帮助。

(注意:我无法使用 OpenGL 解决方案,因为我必须采用相同的算法并将其转换为 PHP/gd 以用于此应用程序的 Web 服务器版本)


您需要做的是减去红色,然后校正“亮度”以匹配旧颜色,无论您选择何种亮度测量。像这样的东西应该有效:

// First, calculate the current lightness.
float oldL = r * 0.30 + g * 0.59 + b * 0.11;

// Adjust the color components. This changes lightness.
r = r - 30;
if (r < 0) r = 0;

// Now correct the color back to the old lightness.
float newL = r * 0.30 + g * 0.59 + b * 0.11;
if (newL > 0) {
    r = r * oldL / newL;
    g = g * oldL / newL;
    b = b * oldL / newL;
}

请注意,当给出纯红色时,这会表现得有些奇怪(它将保持不变)。奥托,GIMP http://www.gimp.org/(版本 2.6.11)在其色彩平衡工具中做了同样的事情,所以我不太担心它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone 上的色彩平衡 的相关文章

  • iOS 7 即席构建安装挂起并显示安装消息

    在构建应用程序时 我添加了有效的架构体系结构作为armv6 armv7 armvs7和体系结构作为标准体系结构 armv7和armv7s 还将构建活动架构仅切换为 否 即席安装挂起 并显示状态安装消息 随附屏幕截图 我已经正确添加了 UDI
  • CAKeyFrameAnimation 中的 keyTime 是什么样的值?

    例如我有这个 CAKeyFrameAnimation CALayer theLayer myView layer CAKeyframeAnimation animation animation CAKeyframeAnimation ani
  • iOS-将图像转为视频时,CVPixelBufferCreate内存无法正确释放

    我正在将图像制作成视频 但总是因为内存警告而崩溃 分配太多CVPixelBufferCreate 我不知道如何正确处理 我看过很多类似的主题 但没有一个能解决我的问题 这是我的代码 void writeImagesArray NSArray
  • 如何在iPhone中将字节数组转换为base64字符串?

    我有一段vb代码 我需要将字节数组转换为 Base 64 字符串 下面是vb代码 如果 arrLicence Count gt 0 那么 LicenseBytes CType Array CreateInstance GetType Byt
  • sizeToFit 运行异常

    我有一段代码 每次发生后端数据库更改时都会执行 本质上我在父视图中有一个标签 标签由许多状态消息之一更新 每个状态消息位于不同的行上 并以换行符 n 结尾 每条状态消息只能在一行上 并且不能过多 我遇到的问题是 当视图首次重新加载时 一切正
  • Visual Studio 2010 支持 iPhone 开发吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • iphone - 如何读取麦克风输入?

    如何从麦克风读取声音数据 我不想录制然后访问数据 我希望能够实时访问声音输入 您可以将麦克风中的声音 PCM 样本 录制到非常短的内存缓冲区 持续时间短至几毫秒 这与使用 iOS API 一样接近 实时 查看 aurioTouch 示例 了
  • 如何在运行时更改按钮的颜色? [复制]

    这个问题在这里已经有答案了 button1 Button root text A1 width 8 grid row 0 column 0 button2 Button root text A2 width 8 grid row 0 col
  • 在 UITableViewCell 内动态更改标签宽度

    我正在尝试建立一个自定义表格视图 正如您在图片中看到的 我在故事板一侧将标签的宽度默认设置为 160 磅 并在加载表格时动态更改宽度 我通过修改 cellForRowAtIndexPath 委托方法来实现此目的 因此 根据日期的长度 我设置
  • 隐藏导航栏和标签栏时,UIView 不会调整为全屏

    我有一个应用程序 它有一个用于正常交互的选项卡栏和导航栏 我的一个屏幕是很大一部分文本 所以我允许用户点击进入全屏 有点像 Photos app 导航栏和标签栏被隐藏 我将文本视图的框架设置为全屏 问题是 标签栏原来所在的位置有大约 50p
  • 当表格为空时 iPhone UITableView 图像背景

    我想当我的 UITableView 为空时显示图像背景 目前 我尝试将 UIImageView 添加到包含表格的视图控制器 但 XCode 不允许这样做 有没有好的方法呢 您可以在表视图顶部添加图像视图或更改表视图的背景视图 Check i
  • 是否可以对 UILabel 的文本颜色变化进行动画处理? [复制]

    这个问题在这里已经有答案了 UIView animateWithDuration 5 animations myLabel textColor UIColor redColor 标签文本颜色立即改变 Try this UIView tran
  • 未找到符号,预计出现在平面命名空间 ObjC++ 中

    我可能遇到了一个简单的问题 但是在编译过程中没有任何信息错误或警告来提醒我出了什么问题 我有一个 Objective C 应用程序 其中包含 C 主文件和 ObjC 头文件 它构建得很好 但是当运行时 它会给出以下错误消息 Dyld Err
  • 在 UIWebView 中禁用复制和粘贴

    几乎 我已经尝试了一切方法来禁用复制 粘贴UIWebView但对我来说没有任何作用 我正在加载我的UIWebView来自字符串 字符串数组 如下所示 webView loadHTMLString NSString stringWithFor
  • 增量后清除推送通知徽章

    我正在研究 iPhone 中的推送通知 当我收到推送通知时 它在我的应用程序图标上显示 1 下次显示 2 3 4 如果我打开应用程序 它是 0 下次它应该是 1 2 3 4 但它显示最后一个数字和 1 我想在打开应用程序后重置推送通知徽章
  • Xcode 中的 NSObject 描述和自定义摘要

    我覆盖对象的 NSString description但是 Xcode 总是显示error summary string parsing error在变量视图的摘要字段中 我当前的实现如下 NSString description retu
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 使用自定义格式将字符串转换为 NSDate [重复]

    这个问题在这里已经有答案了 可能的重复 NSString 到 NSDate https stackoverflow com questions 1353081 nsstring to nsdate iPhone 如何将 yyyyMMddTh
  • iOS 开发:如何强制 UIWebView 加载 Facebook 的非移动版本?

    我正在深入研究 iOS 开发 当我尝试在 UIWebView 中加载特定的 Facebook 粉丝页面时 它会加载该网站的移动版本 该版本仅加载粉丝页面的墙 而不是我需要加载的特定选项卡 在我的应用程序的 iPad 版本中 UIWebVie
  • iOS 11 中的密码自动填充快速输入栏

    iOS 11 中引入了一项新功能 应用程序密码自动填充 此功能允许用户直接从键盘快速输入栏使用其应用程序中保存的密码 https techcrunch com 2017 06 08 ios 11s new password autofill

随机推荐