jjzjj

iOS 图片编辑开源库——或者只是一些小技巧

coder 2023-09-25 原文

对于我正在编写的 ios 应用程序,我想从照片库中拍摄一张照片,然后让用户“清理它”,基本上删除不需要的部分。例如,假设用户选择了一张人的照片,我的应用程序只需要头部,其他所有内容都应该删除,因此用户需要通过删除背景、 body 或照片中的其他人来清理照片。想象一下类似 Photoshop 的体验,但只有一个工具——橡皮擦。

我正在寻找开源库、示例或只是关于如何开始使用的提示。

我知道如何使用 UIImagePickerController 选择图像,因此缺少的部分是实际的编辑。作为一个完全的菜鸟,我很乐意就什么是合理的方法获得一些建议,最好是一些示例代码,甚至是可重用的库。

我想,在高层次上,我想做的是从一个矩形图像开始,并确保它有一个 alpha 层,然后当用户触摸图像的某些部分以删除它们时,我需要“删除”通过将它们的 alpha 级别更改为 0 从图像中获得更多像素。但这是一个太高级别的描述,我什至不确定是否正确......另一个合理的要求是撤消支持。

想到的另一种方法是使用原始图像和用户在触摸屏幕时编辑的蒙版图像,当“完成”时,以某种方式将两个图像编译为一个具有 alpha 的图像。当然,这是一个实现细节,用户不需要知道屏幕上有两个图像。

如果可能,我希望停留在 UIImage 或 UIImageView 或 Core Graphics 级别,而不必与 OpenGL ES 混为一谈。我的直觉是,更高的图形级别应该具有足够的性能并且易于理解,可维护的干净代码是一个考虑因素......

感谢任何建议,谢谢!

最佳答案

事实证明这很容易,感谢@Rog 的指点。
我将在下面粘贴我的解决方案。这进入 Controller 代码:

#pragma mark - touches

- (void) clipImageCircle:(CGPoint)point radius:(CGFloat)radius {
  UIBezierPath* uiBezierPath = [UIBezierPath  bezierPathWithArcCenter:point radius:radius startAngle:0 endAngle:2 * M_PI clockwise:NO];
  CGPathRef erasePath = uiBezierPath.CGPath;
  UIImage *img = imageView.image;
  CGSize s = img.size;
  UIGraphicsBeginImageContext(s);
  CGContextRef g = UIGraphicsGetCurrentContext();
  CGContextAddPath(g, erasePath);
  CGContextAddRect(g,CGRectMake(0, 0, s.width, s.height));
  CGContextEOClip(g);
  [img drawAtPoint:CGPointZero];
  imageView.image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
}

- (void) receiveTouch:(CGPoint)point {
  NSLog(@"%@", NSStringFromCGPoint(point));
  [self clipImageCircle:point radius:20];
}

- (void) endTouch {
  NSLog(@"END TOUCH");
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  // We currently support only single touch events
  UITouch* touch = [touches anyObject];
  CGPoint point = [touch locationInView:imageView];
  if ([imageView hitTest:point withEvent:event]) {
    [self receiveTouch:point];
  }
}

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
  [self endTouch];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  [self endTouch];
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  UITouch* touch = [touches anyObject];
  CGPoint point = [touch locationInView:imageView];
  if ([imageView hitTest:point withEvent:event]) {
    [self receiveTouch:point];
  }
}

关于iOS 图片编辑开源库——或者只是一些小技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436160/

有关iOS 图片编辑开源库——或者只是一些小技巧的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  10. ruby-on-rails - 尝试打开 .gitignore 以在文本编辑器中对其进行编辑,但在 OS X Mountain Lion 上找不到文件位置 - 2

    我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位

随机推荐