iOS 判断触摸位置是否在图片的透明区域

装扮功能系列:

  1. Swift 使用UIScrollerView 实现装扮功能(基础)
  2. Swift 使用UIScrollerView 实现装扮功能(拓展)
  3. iOS 判断触摸位置是否在图片的透明区域

背景

在装扮功能中,一般都是长按使道具进入编辑状态,两个物品重叠一部分并且上面一个道具具有较大的透明区域时,明明想编辑的是下面一个道具,然而进入编辑状态的却是在上面的较大的一个道具。那么我们可以如何优化用户体验呢?可以通过判断触摸点的位置,如果是透明区域就不响应不进入编辑状态,从上到下遍历,直到找到非透明的道具然后将它设为编辑状态。
请添加图片描述

图片组成

图片的组成主要由像素(Pixels)和元数据(Metadata)两部分构成。

  1. 像素:图片是由一个个像素点组成的。每个像素代表图像中的一个小区域,并包含了该区域的颜色信息。常见的颜色模型是RGB(红绿蓝),每个像素的颜色由红、绿、蓝三个分量的数值来表示。每个分量的数值通常以8位无符号整数(0-255)的形式表示,可以通过不同的数值组合形成各种颜色。除了红、绿、蓝三个分量,每个像素还可以包含一个透明度分量。透明度分量用于表示像素的不透明度或透明度,决定了像素在图像中的可见程度。透明度值通常以8位无符号整数(0-255)表示,其中0表示完全透明,255表示完全不透明。
  2. 元数据:除了像素数据之外,图片还包含了一些描述图像属性和特征的元数据。元数据可以包括图像的尺寸、分辨率、创建日期、拍摄设备信息、拍摄参数、版权信息等。元数据提供了对图像的更多信息和上下文,使得图片的使用和管理更加方便和有意义。常见的图像文件格式如JPEG、PNG等都支持存储元数据。

分析和实现需求

当我们理解啦图片的基本构成后,我们的需求就可以理解成:判断当前触摸点在图片上对应的位置上的像素点,获取像素点的颜色信息中的透明度的值,透明度的值为0的话,就判定当前点击的位置是图片的透明区域,否则就是非透明区域。

一、位置转换
前提:图片是等比例缩放布局显示的
将当前触摸点的位置转换为图片上的位置。

  1. 获取触摸点位置
  2. 获取图片大小
  3. 根据控件坐标转换成图片坐标
       @objc func tapClick(_ gesture:UITapGestureRecognizer){
    
        //在图片控件中的位置
        let treePoint = gesture.location(in: treeImageV)
        print("treePoint:\(treePoint)")
        
        //真实图片上的位置
        let imageW = treeImageV.image?.size.width ?? 0
        let imageH = treeImageV.image?.size.height ?? 0
        let treeImagePointX = treePoint.x * imageW/treeImageV.yh_width
        let treeImagePointY = treePoint.y * imageH/treeImageV.yh_height
        
        let treeImagePoint = CGPoint(x: treeImagePointX, y: treeImagePointY)
        
        print("treeImagePoint:\(treeImagePoint)")
        
        
        if let treeImage = treeImageV.image, isPointTransparent(treeImagePoint, in: treeImage){
            print("当前点击的是treeImage的透明区域")
        }

    }

二、透明度
通过转换后的坐标,拿到当前坐标的像素点,然后再根据像素中的颜色信息判断是否透明

// 判断图像中指定位置是否透明
    func isPointTransparent(_ point: CGPoint, in image: UIImage) -> Bool {
        guard let cgImage = image.cgImage else {
            return false
        }
        
        let width = cgImage.width
        let height = cgImage.height
        
        let targetX = Int(point.x)
        let targetY = Int(point.y)
        
        // 检查目标点是否在图像范围内
        if targetX < 0 || targetX >= width || targetY < 0 || targetY >= height {
            return false
        }
        //获取图像的数据提供者
        guard let provider = cgImage.dataProvider else {
            return false
        }

        // 获取图像的数据并将其转换为字节数组
        guard let pixelData = provider.data, let data = CFDataGetBytePtr(pixelData) else {
            return false
        }
        //获取图像的alpha信息
        let alphaInfo = cgImage.alphaInfo
      
        let bytesPerPixel = cgImage.bitsPerPixel / 8
        let pixelOffset = (targetY * cgImage.bytesPerRow) + (targetX * bytesPerPixel)
        if alphaInfo == .none {
            // 对于没有透明度通道的图像,直接判断颜色通道是否为0
            return data[pixelOffset] == 0 && data[pixelOffset + 1] == 0 && data[pixelOffset + 2] == 0
        } else {
            // 对于有透明度通道的图像,判断透明度是否为0
            return data[pixelOffset + bytesPerPixel - 1] == 0
        }
    }

感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/455013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装MySQL8.0及以上版本操作步骤

关于mysql安装过程中命令mysqld --initialize --console出错的解答 C:\mysql-8.3.0-winx64\bin>mysqld --initialize --usermysql --console 2024-03-12T11:21:23.201387Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 2024-03-12T11:21:23.2068…

【C语言】字符串函数上

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是字符串函数上篇&#xff0c;主要是关于长度不受限制的字符串函数&#xff08;strlen,strcpy,strcat,strcm…

报错:Nginx 部署后刷新页面 404 问题

文章目录 问题分析解决 问题 在部署完项目后 刷新页面&#xff0c;页面进入了404 分析 加载单页应用后路由改变均由浏览器处理&#xff0c;而刷新时将会请求当前的链接&#xff0c;而Nginx无法找到对应的页面 关键代码try_files,剩下俩如果其他地方配置了则可以省略。 在这…

网络安全等级测评师考试培训可以参考哪些资料?

网络安全是国家安全的重要组成部分&#xff0c;也是企业安全的重中之重&#xff1b;而网络安全等级测评师则是守护这一安全领域的重要力量。所以专业的网络安全等级测评师是非常重要。作为专业的网络安全等保测评师&#xff0c;他们肩负着对信息系统进行安全评估、发现潜在风险…

三星泄露微软 Copilot 新功能:用自然语言操控各种功能

3 月 11 日消息&#xff0c;微软计划本月晚些时候发布新款 Surface 电脑和适用于 Windows 11 的 Copilot 新功能&#xff0c;但三星似乎等不及了&#xff0c;在其即将推出的 Galaxy Book4 系列产品宣传材料中泄露了一些即将到来的 Copilot 功能。 三星官网上发布的图片证实了此…

leetcode刷题(javaScript)——堆相关场景题总结

堆是什么&#xff1f;堆都能用树表示&#xff0c;并且一般树的实现都是利用链表。平时使用的最多的是二叉堆&#xff0c;它可以用完全二叉树表示&#xff0c;二叉堆易于存储&#xff0c;并且便于索引。在堆的实现时注意&#xff1a;因为是数组&#xff0c;所以父子节点的关系就…

【智能算法】蝠鲼觅食优化算法(MRFO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2017年&#xff0c;Zhao等人受到蝠鲼自然捕食行为启发&#xff0c;提出了蝠鲼觅食优化算法(Manta Ray Foraging Optimization&#xff0c;MRFO)。 2.算法原理 2.1算法思想 MRFO模拟了蝠鲼在海洋中…

54、WEB攻防——通用漏洞跨域CORS资源JSONP回调域名接管劫持

文章目录 同源策略CORSJSONP跨域回调子域名劫持 同源策略 同源策略包括三个条件&#xff1a;同域名、同域名、同端口。同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互。 CORS CORS&#xff08;跨域资源共享&#xff09;已被所有浏览器支持&#xff0c;跨…

简单了解 vim 编辑器最基础的操作

简单了解 vim 编辑器最基础的操作 vim 这个是 Linux 上自带的一个文本编辑器&#xff0c;使用 vim 就可以更灵活的对文件进行编辑了&#xff08;虽然和记事本的定位差不多,实际上vim的使用要复杂很多&#xff09; 1.打开文件 语法&#xff1a;vim 文件名 示例&#xff1a;…

简单理解NAT模式和桥接模式

目录 桥接模式NAT模式总结 桥接模式 1.桥接模式下 当物理机X创建了一台或多台虚拟机 那么这些创建出来的虚拟机 可以视作一台独立的新机器 加入了该局域网 并允许和该局域网的物理机或者其他虚拟机直接通信 2.问题一在于 C类网的分配是有范围的(0-255) 假如是一个教室里的局域…

智慧公厕建设,助力打造宜居、韧性、可持续的智慧城市

公共厕所作为智慧城市的重要组成部分&#xff0c;对于城市的高质量发展起着至关重要的作用。智慧公厕建设旨在通过全面监测、控制和管理公共厕所&#xff0c;实现多方面功能&#xff0c;包括公共厕所环境监测与调控、厕位占用监测与引导、消耗品监测与缺失提示、安全防范与管理…

WPF监控平台(科技大屏)[一]

跟着B站的视频敲了一个略微复杂的WPF界面,链接如下.在这里我详细的写一份博客进行设计总结. 系统介绍和配置及主窗口设计_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Wy421Y7QD?p1&vd_source4796b18a2e4c1ec8a310391a5644b6da 成果展示 实现过程 总体来说,我的…

Shell常用脚本:hadoop集群启动、停止、重启脚本

脚本内容以我搭建的hadoop集群为例&#xff0c;你们自用的时候自行根据你们的情况进行修改即可 hadoop-cluster-manager.sh #!/bin/bash # 1. 调用此脚本前&#xff0c;请使用ssh-keygen -t rsa、ssh-copy-id -f 目标机器这两个命令使得目标机器是免密登录的 # 2. ssh远程执行…

Linux常用操作命令和服务器硬件基础知识

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

【开源】SpringBoot框架开发班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)

导 读 本文主要介绍使用YOLOv9和OpenCV实现车辆跟踪计数&#xff08;步骤 源码&#xff09;。 实现步骤 监控摄像头可以有效地用于各种场景下的车辆计数和交通流量统计。先进的计算机视觉技术&#xff08;例如对象检测和跟踪&#xff09;可应用于监控录像&#xff0c;…

2023 收入最高的十大编程语言

本期共享的是 —— 地球上目前已知超过 200 种可用的编程语言&#xff0c;了解哪些语言在 2023 为开发者提供更高的薪水至关重要。 过去一年里&#xff0c;我分析了来自地球各地超过 1000 万个开发职位空缺&#xff0c;辅助我们了解市场&#xff0c;以及人气最高和收入最高的语…

C++_智能指针

目录 1、内存泄漏 1.1 什么是内存泄漏 1.2 内存泄漏的危害 1.3 如何避免内存泄漏 2、智能指针的应用场景 3、智能指针的原理 3.1 RAII 3.2 智能指针的使用 4、智能指针的拷贝问题 5、auto_ptr 6、unique_ptr 7、share_ptr 7.1 循环引用 7.2 weak_ptr 结…