UIImage 的宝丽来滤镜

2023-12-03

我正在尝试在 iPhone 中实现一些图像滤镜,例如宝丽来。我搜索了如何过滤现有的 UIImage 将其转换为polaroid风格和遇到this堆栈溢出链接。以那里的答案为起点,我循环遍历图像的每个像素,获取 RGB 值,并将它们转换为 HSV,到目前为止我已经成功了。这就是我所做的(任何人都可以自由指出任何错误..)

double minRGB(double r, double g, double b){
    if (r < g){
        if (r < b){
            return r;
        }else {
            return b;
        }
    }else { 
        if (g < b){
            return g;
        }else{
            return b;
        }
    }
}



double maxRGB(double r, double g, double b){
    if (r > g){
        if (r > b){
            return r;
        }else {
            return b;
        }
    }else { 
        if (g > b){
            return g;
        }else {
            return b;
        }
    }
}

void rgbToHsv(double redIn,double greenIn,double blueIn,double *hue,double *saturation,double* value){
    double min,max,delta;

    min                         =   minRGB(redIn,greenIn,blueIn);
    max                         =   maxRGB(redIn,greenIn,blueIn);
    *value                      =   max;
    delta                       =   max - min;
    if (max != 0) {
        *saturation             =   delta/max;
    }else {
        *saturation             =   0;
        *hue                        =   -1.0;
        return ;
    }
    if (redIn == max) {
        *hue                    =   (greenIn - blueIn)/delta;
    }else if (greenIn == max) {
        *hue                    =   2 + (blueIn - redIn)/delta;
    }else {
        *hue                    =   4 + (redIn - greenIn)/delta;
    }
    *hue                        *=  60.0;
    if (*hue < 0) {
        *hue                    +=  360.0;
    }
}

void hsvToRgb(double h,double s, double v, double *r,double *g, double *b){
    int i;
    float f, p, q, t;
    if( s == 0 ) {
        // achromatic (grey)
        *r = *g = *b = v;
        return;
    }
    h                           /=  60;         // sector 0 to 5
    i                           =   floor( h );
    f                           =   h - i;          // factorial part of h
    p                           =   v * ( 1 - s );
    q                           =   v * ( 1 - s * f );
    t                           =   v * ( 1 - s * ( 1 - f ) );
    switch( i ) {
        case 0:
            *r = v;
            *g = t;
            *b = p;
            break;
        case 1:
            *r = q;
            *g = v;
            *b = p;
            break;
        case 2:
            *r = p;
            *g = v;
            *b = t;
            break;
        case 3:
            *r = p;
            *g = q;
            *b = v;
            break;
        case 4:
            *r = t;
            *g = p;
            *b = v;
            break;
        default:        // case 5:
            *r = v;
            *g = p;
            *b = q;
            break;
    }
}


-(void)makeImagePolaroid:(UIImage*)myImage{
CGImageRef originalImage        =   [myImage CGImage];
CGColorSpaceRef colorSpace      =   CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext      =   CGBitmapContextCreate(NULL,CGImageGetWidth(originalImage),CGImageGetHeight(originalImage),8,CGImageGetWidth(originalImage)*4,colorSpace,kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGBitmapContextGetWidth(bitmapContext), CGBitmapContextGetHeight(bitmapContext)), originalImage);
UInt8 *data                     =   CGBitmapContextGetData(bitmapContext);
int numComponents               =   4;
int bytesInContext              =   CGBitmapContextGetHeight(bitmapContext) * CGBitmapContextGetBytesPerRow(bitmapContext);
double redIn, greenIn, blueIn,alphaIn;
double hue,saturation,value;

for (int i = 0; i < bytesInContext; i += numComponents) {
    redIn                       =   (double)data[i]/255.0;
    greenIn                     =   (double)data[i+1]/255.0;
    blueIn                      =   (double)data[i+2]/255.0;
    alphaIn                     =   (double)data[i+3]/255.0;
    
    rgbToHsv(redIn,greenIn,blueIn,&hue,&saturation,&value);
    
    hue                         =   hue * 0.7;
    if (hue > 360) {
        hue                     =   360;
    }
    
    saturation                  =   saturation *1.3;
    if (saturation > 1.0) {
        saturation              =   1.0;
    }

    value                       =   value * 0.8;
    if (value > 1.0) {
        value                   =   1.0;
    }
    
    hsvToRgb(hue,saturation,value,&redIn,&greenIn,&blueIn);
    data[i]                     =   redIn * 255.0;
    data[i+1]                   =   greenIn * 255.0;
    data[i+2]                   =   blueIn * 255.0;
}
CGImageRef outImage             =   CGBitmapContextCreateImage(bitmapContext);
myImage                         =   [UIImage imageWithCGImage:outImage];
CGImageRelease(outImage);
return myImage;
}

现在我对图像处理的想法非常幼稚(甚至不是业余的)。我读this并尝试调整饱和度和色调,看看是否可以获得宝丽来效果。我想我错过了一些东西,因为我得到了除了宝丽来之外的地球上的所有效果(说我什么都没有)。

  1. 网上有没有任何文档(或 书籍)讲述图像 从程序员的角度进行过滤 看法? (而不是设计师的观点 视图且无需 Photoshop 截屏)
  2. 什么是色相、饱和度、明度 我必须在像素上做出改变 这样我就可以拍出宝丽莱照片了?
  3. 第三,我走在正确的道路上吗?

提前致谢..


这可能会有所帮助,因为 Camera+ 从 Photoshop 中获取滤镜并为 iOS 复制它们。

http://taptaptap.com/blog/creating-a-camera-plus-fx/

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

UIImage 的宝丽来滤镜 的相关文章

  • 进入/退出编辑模式时重绘 UITableViewCell

    我有一个表格视图 其中根据表格是否正在编辑 单元格的构建方式有所不同 具体来说 处于编辑模式时选择样式为无 非编辑模式时选择样式为蓝色 当我从一个单元转换到另一个单元时 我注意到某些单元格没有更新 快速的日志记录告诉我 即使单元格的外观发生
  • 如何在iPhone应用程序中的类结构中实现主键和外键表数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何连接sqlite数据库中的两个表数据 if sqlite3 open dbPath UTF8String database SQL
  • 带有子视图的 UIView beginAnimations

    我有一个漂亮且简单的视图 缩放 动画 它以一个点开始并动画到全屏尺寸 UIView beginAnimations nil context NULL UIView setAnimationBeginsFromCurrentState YES
  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB
  • 找到图像特征宽度的正确方法和Python包

    输入是一个在黑色背景上带有彩色 抱歉 垂直线的光谱 给定该带的近似 x 坐标 用 X 标记 我想找到该带的宽度 我对图像处理不熟悉 请引导我前往正确的方法图像处理和Python图像处理package也能起到同样的作用 我认为 PIL Ope
  • 为什么我的图像下方有空间? [复制]

    这个问题在这里已经有答案了 图像在下面获得了神秘的空白空间 即使padding 0 margin 0被应用 示范 http jsfiddle net cLETP 红色边框应该包围图像 但底部有空间 造成这种情况的原因是什么 如何删除该空间
  • iPhone 中的 NSNotification

    我正在将 NSSNotifcation 发送到 iPhone 应用程序中的另一个视图控制器 但它的观察者方法收到两次通知 这可能如何 任何人都可以指导我 我已经使用此代码来发布通知 NSNotificationCenter defaultC
  • iphone - 自动释放,没有池 - 只是泄漏

    我的主代码中有这一行 self performSelectorInBackground selector animateMe withObject nil 这是 animateMe void animateMe UIView animate
  • NSString – 静态还是内联?有性能提升吗?

    如果我写的话会有任何性能提升吗 NSString helloStringWithName NSString name static NSString formatString Hello return NSString stringWith
  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 使用 iPhone 中的地图视图读取当前位置名称

    我读取了当前位置的纬度和经度值 然后成功将该位置固定在 iPhone 中 现在我想使用这个纬度和经度值读取该地名 我使用以下代码来读取查找当前位置 void mapView MKMapView mapView1 didUpdateUserL
  • 调整图像的亮度、对比度和伽玛值

    在 NET 中调整图像的亮度 对比度和伽玛值的简单方法是什么 c and gdi have a simple way to control the colors that are drawn It s basically a ColorMa
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 在 Android 中调整可绘制对象的大小

    我正在为进度对话框设置一个可绘制对象 pbarDialog 但我的问题是我想每次调整可绘制的大小 但不知道如何调整 这是一些代码 Handler progressHandler new Handler public void handleM
  • 使用 CSS 的响应式图像

    我发现调整图像大小以使其具有响应能力很棘手 我正在开发一个 php 应用程序来自动将网站转换为响应式版本 我有点被图像困住了 我已经成功地为网站上的每个图像添加了一个包装类 并且可以很好地调整图像的大小 我的问题在于自然小于窗口的图像 例如
  • insertNewObjectForEntityForName:

    我使用 Xcode xcdatamodel 文件编辑器设置了一个实体 我创建了一个名为 Person 的实体 添加了一些属性 然后生成了一个 m 文件来表示它 一切都很好 现在 当我去编写一行代码时 例如 Person person Per
  • 在 iPhone 中缝合图片

    我想并排缝合2张png 在Cocoa中 我会使用 NSImage initWithSize 然后只是drawInRect 但是 UIImage 没有 initWithSize 类 我现在该怎么做 Use UIGraphicsBeginIma
  • 如何阻止 UITableView moveRowAt IndexPath 在重新排序时留下空白行

    我遇到一个问题 在重新排序 UITableViewCells 时 tableView 不随单元格滚动 仅出现一个空白行 任何后续滚动都会出现数组越界错误 堆栈跟踪中没有我的任何代码 这是该问题的快速视频 http www screencas

随机推荐

  • 在 iOS 中使用 Core Graphics 绘制 VU 表

    我正在尝试使用 Core Graphics 绘制与此有点相似的图像 我能够绘制主弧 但我无法理解 如何将弧分成几部分 在弧上绘制刻度 我当前绘制圆弧的代码是 path addArcWithCenter point radius radius
  • 使用适用于 Android 的 google place api 网络服务搜索附近的特定地点

    我试图使用 google place api web 服务将地点搜索类型限制为医院 但无法实现 Logcat java lang NullPointerException 在 com ediode graphics3d ClinicFrag
  • 我如何将这些更改为 NuSMV 模型中的 CTL SPEC?

    我需要帮助编写这些 CTL 我还不太明白如何以 NuSMV 格式编写 希望我的代码对您有意义 因为它是不完整的 atm 2 如果一个进程正在等待 它最终会到达其临界区 3 两个进程必须 轮流 进入临界区 4 一个进程有可能连续两次进入临界区
  • kubectl apply 与 kubectl create?

    我对文档的理解是 kubectl create 在集群中创建新的k8s资源 kubectl replace 更新实时集群中的资源 kubectl apply 如果我想做创建 替换 参考 我的问题是 为什么在集群中需要三个操作来执行相同的任务
  • 如何在操作栏溢出菜单中对齐菜单项文本

    我正在使用 ActionBarSherlock 在我的 Android 应用程序中实现操作栏 不适合此操作栏的菜单选项会自动添加到溢出菜单中 我面临的问题是这些菜单选项具有中心对齐 如何确保溢出菜单中的菜单项右对齐 例如在 Gmail 应用
  • 通过引用抛出非常量临时值

    通过非常量引用抛出在 try 块中在堆栈上构造的对象 捕获它并修改它 然后通过引用另一个 catch 块将其抛出 是否有任何问题 下面是我所指内容的一个简短示例 struct EC EC string msg what msg string
  • 删除字符串中空格后的所有内容

    我想删除字符串中空格后的所有内容 例如 my string is sad 应该返回 my 我一直试图弄清楚如何使用 sub gsub 来做到这一点 但到目前为止还没有成功 您可以使用正则表达式 例如 sub x See the 正则表达式演
  • 在 Bash 中 ssh 和运行多个命令的最简洁方法是什么?

    我已经设置了 ssh 代理 并且我可以在 Bash 脚本中的外部服务器上运行命令 执行以下操作 ssh blah server ls pwd 现在 我真正想做的是在外部服务器上运行大量长命令 将所有这些内容括在引号之间会非常难看 而且我真的
  • 如何使用 Red Hat Linux 上的标准工具随机化文件中的行?

    如何使用 Red Hat Linux 上的标准工具随机化文件中的行 我没有shuf命令 所以我正在寻找类似的东西perl or awk完成相同任务的单行 嗯 我们不要忘记 sort random sort
  • 如何使容器在 HTML/CSS 中居中?

    作为我任务的一部分 我开发了一个网站 由于我是 html css 新手 我无法从代码中找出一些问题 分配规范规定屏幕尺寸应在一定尺寸内 以便大多数浏览器都可以打开它 并且用户不应体验到任何滚动活动 所以我用div来划分整个页面以适应大小 但
  • 如何使用 Chrome 扩展程序在页面加载之前隐藏所有内容

    我尝试使用内容脚本 manifest content scripts matches js js content script js content script js ini function ini document body styl
  • SSL 性能影响[重复]

    这个问题在这里已经有答案了 可能的重复 SSL 会产生多少开销 最近 我与一位开发人员进行了交谈 他告诉我 在站点范围内实施 SSL 会使服务器负载增加 300 倍 这真的可信吗 我目前在所有页面上都使用 SSL 每天有数千名用户访问系统
  • 使 HTML 表格单元格中的文本与其他单元格重叠

    我希望单元格中的一些较长文本重叠在下一个单元格中 而不是换行 但又不会使第一列变大 如果我给细胞 white space nowrap position absolute 它将位于正确的位置 但其他文本将在其下方流动 感谢您的快速答复 您可
  • JS 四舍五入到小数点后两位 [重复]

    这个问题在这里已经有答案了 我试图将返回的数字限制为小数点后两位 但此代码对我不起作用 function myFunction var x document getElementById mySelect value document ge
  • 尝试使用 MATLAB 绘制 z = x + y 时出现错误的图形

    我正在尝试在 MATLAB 中绘制 3D 曲面 并且我利用了meshgrid 类似于 MATLAB 教程中所说的 http www mathworks com help matlab ref meshgrid html 我编写了一个非常简单
  • php 正则表达式用目录分隔符替换路径中的“任何”斜杠

    我正在尝试采取这样的路径 一些 路径 这里 一些 其他 路径 并将路径中的每个斜杠替换为 PHP 的 DIRECTORY SEPARATOR 内置常量 我有这个 subject asdf var preg replace DS subjec
  • Firebase 在 Swift 中检索自动 ID 下面的数据

    我在从 Firebase 检索数据时遇到麻烦 我想读取 auto ID 下 JSON 中的所有 contactName 数据 然后附加到 UIPickerView Here is my JSON tree used childByAutoI
  • 接口指定的属性的多态性

    为什么这不起作用 public class ClassOptions public interface Inode ClassOptions Options get public class MyClass Inode public Cla
  • VBScript - 复制过去 24 小时内修改的文件

    我正在尝试从上次修改日期在当前日期 24 小时内的目录中复制文件 我在文件路径中使用通配符 因为它每天都在变化 option explicit dim fileSystem folder file dim path path d x log
  • UIImage 的宝丽来滤镜

    我正在尝试在 iPhone 中实现一些图像滤镜 例如宝丽来 我搜索了如何过滤现有的 UIImage 将其转换为polaroid风格和遇到this堆栈溢出链接 以那里的答案为起点 我循环遍历图像的每个像素 获取 RGB 值 并将它们转换为 H