比较两个图像以检查它们是否相同

2023-11-30

我有一个带有 ImageView 的配置文件视图,用户可以在其中更改他们的图片。我正在保存我的新旧图像以进行比较。我想知道它们是否相同,所以如果是,我不需要将新的推送到我的服务器。

我尝试了这个,但它并没有真正起作用:

+ (NSData*)returnImageAsData:(UIImage *)anImage {
    // Get an NSData representation of our images. We use JPEG for the larger image
    // for better compression and PNG for the thumbnail to keep the corner radius transparency
    float i_width = 400.0f;
    float oldWidth = anImage.size.width;
    float scaleFactor = i_width / oldWidth;

    float newHeight = anImage.size.height * scaleFactor;
    float newWidth = oldWidth * scaleFactor;

    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
    [anImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    NSData *imageData = UIImageJPEGRepresentation(newImage, 0.5f);

    return imageData;
}

+ (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2
{

    NSData *data1 = [self returnImageAsData:image1];
    NSData *data2 = [self returnImageAsData:image2];

    return [data1 isEqual:data2];
}

知道如何检查两个图像是否相同吗?

最终结果:

+ (NSData*)returnImageAsData:(UIImage *)anImage {
    // Get an NSData representation of our images. We use JPEG for the larger image
    // for better compression and PNG for the thumbnail to keep the corner radius transparency
//    float i_width = 400.0f;
//    float oldWidth = anImage.size.width;
//    float scaleFactor = i_width / oldWidth;
//    
//    float newHeight = anImage.size.height * scaleFactor;
//    float newWidth = oldWidth * scaleFactor;
//    
//    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
//    [anImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
//    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//    UIGraphicsEndImageContext();

    NSData *imageData = UIImageJPEGRepresentation(anImage, 0.5f);

    return imageData;
}

+ (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2
{
    CGSize size1 = image1.size;
    CGSize size2 = image2.size;

    if (CGSizeEqualToSize(size1, size2)) {
        return YES;
    }

    NSData *data1 = UIImagePNGRepresentation(image1);
    NSData *data2 = UIImagePNGRepresentation(image2);

    return [data1 isEqual:data2];
}

如果您想查看两张图像的像素是否相同,那应该很容易。

将图像保存为 JPEG 可能会导致问题,因为 JPEG 是一种有损格式。

正如其他人所建议的,首先确保两个图像的高度和宽度匹配。如果没有,就停下来。图像不同。

如果匹配,请使用 UIImagePNGRepresentation() 等函数将图像转换为无损数据格式。然后对您返回的 NSData 对象使用 isEqual 。

如果您想检查图像是否看起来相同(例如同一场景的两张照片),那么您面临的问题要困难得多。您可能需要借助 OpenCV 等软件包来比较图像。

编辑:我不知道 UIImage 是否有 isEqual 的自定义实现,您可以使用它来比较两个图像。我会先尝试一下。

查看文档,UIImage 也符合 NSCoding,因此您可以使用 archivedDataWithRootObject 将图像转换为数据。这可能比 PNG 编码更快。

最后,您可以获得指向图像底层 CGImage 对象的指针,获取它们的数据提供者,并以这种方式比较它们的字节流。

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

比较两个图像以检查它们是否相同 的相关文章

  • 如何在iOS中处理1到3个手指的滑动手势

    我使用以下代码来处理代码中的 1 根手指滑动 UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget self action selector
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • 如何保护 iOS 应用程序免受任何操作系统攻击(在越狱设备上)

    我希望保护我的应用程序数据 以防任何操作系统攻击或越狱 iOS 设备上的未经授权的访问 在这种情况下 有什么方法可以检测此类威胁并保护应用程序数据 虽然我同意 jrturton 的说法 但如果您有想要保护的关键数据免受流氓应用程序 而不是用
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • 从按钮执行 Segue 时应用程序冻结

    我的故事板中有一个按钮 它呈现一个带有模式序列的视图控制器 每次按下此按钮时 应用程序都会冻结 没有崩溃 也没有错误消息 prepareForSegue被调用 所有应该存在的视图控制器都在代码中prepareForSegue 但它们不会出现
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • iOS 7 上 Safari 浏览器的用户代理

    我只想在带有 Safari 浏览器的 iPhone 和 iPod 中打开我的网站 对于 Chrome Dolphin 等任何其他浏览器 它不应该打开 但目前我从几乎所有设备获得相同的用户代理 对于Safari User Agent Stri
  • 如何在没有 SDK 的情况下在 Objective C 中为 S3 创建预签名 URL?

    我正在构建一个 mac 应用程序not使用 AWS iOS 开发工具包 我尝试构建的 GET 请求应遵循以下通用格式 Authorization AWS AWSAccessKeyId base64 hmac sha1 VERB n CONT
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • 接收者'ClassName'是一个转发类,对应的@interface可能不存在

    我目前正在寻找一个UIPickerTable在 UIPickerView subviews 内 所以我循环并执行isKindOfClass UIPickerTable class 它有效 但由于 UIPickerTable 的标头未公开 我
  • 如果我使用自定义 UITableViewCell,是否需要设置 heightForRowAtIndexPath?

    如果我使用自定义 UITableViewCell 是否需要设置 heightForRowAtIndexPath 在我的 NIB 中 我已经设置了单元高度 当我覆盖 heightForRowAtIndexPath 时 单元格的内容不会出现 即
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr
  • 更改 iOS7 中 UIAlertView 的字体大小

    我想更改alertView中消息文本和标题文本的字体大小 苹果网站上没有任何文档谈到这一点 但苹果在其子类注释中表示 UIAlertView 类旨在按原样使用 请参考以下链接 https developer apple com librar

随机推荐

  • ggplot 中的反向日期时间(POSIXct 数据)轴

    我正在尝试使用 ggplot 创建 POSIXct 时间图 并且想反转轴 但正在努力使其工作 我一直在使用scale y datetime 因为在我的实际应用程序中 控制该轴上的中断非常重要 这是我的问题的一个例子 首先是正常排序 然后是我
  • 获取 Android 设备的永久唯一 ID

    我有一个应用程序 我想在其中使用唯一 ID 来识别设备 我尝试了多种解决方案 但在手机重置后唯一 ID 发生了变化 如 ANDROID ID 我使用了下面的 StackOverflow 链接 但现在不可用 Android 设备有唯一的 ID
  • Matlab加载库错误

    我打算将OpenCV 1 1版本和Matlab2011一起使用 该程序使用调用来加载库 但是 它返回一个错误 gt In loadlibrary at 347 In Untitled at 4 Error using loadlibrary
  • 在 Java 中将二进制输入流读入单个字节数组

    文档说不应该使用available 确定尺寸的方法InputStream 我怎样才能阅读一篇文章的全部内容InputStream到字节数组中 InputStream in assuming already present byte data
  • ActionBarCompat 菜单项未显示[重复]

    这个问题在这里已经有答案了 这是我的general xml file menu menu
  • 在 ruby​​ on Rails 中提交表单时显示结果数据,无需刷新页面

    我对 ruby on Rails 很陌生 我遇到了一个问题 我有一个主题列表 在此列表下方有一个用于添加主题的表格 我正在尝试添加一个主题而不刷新页面 并将该主题显示在主题列表的正下方 新添加的主题正在插入数据库 但如果不刷新页面 它不会显
  • TypeScript 1.5:ES6 模块默认导入 CommonJS 'export ='(.d.ts 唯一问题?)[重复]

    这个问题在这里已经有答案了 我遇到了以下问题 import moment from moment moment本身是一个默认 CommonJS 导出的函数 如此处编码https github com borisyankov Definite
  • Chrome 在没有任何用户交互的情况下立即消除确认()提示

    我们网站的一些用户报告说confirm对话框出现 但立即消失 就好像它们被自动关闭一样 这似乎只影响 Chrome 而不影响其他浏览器 甚至 Chromium 搜索类似问题发现很多人都在抱怨confirm里面的对话onbeforeunloa
  • NSMutableDictionary setObject:forKey: 无法添加密钥

    我确信我在尝试编写的一个小型iPhone程序中遗漏了一些东西 但是代码很简单并且编译时没有任何错误 所以我无法看出错误在哪里 我设置了一个 NSMutableDictionary 来存储学生的属性 每个属性都有一个唯一的键 在头文件中 我声
  • 如何自定义 git 的合并提交消息?

    每次进行合并时 我都需要生成合并提交 并且我希望它不仅仅是所有提交的摘要 我的问题是如何格式化 git fmt merge msg 或决定此自动消息的因素 我可以在提交后通过修改并使用 git log pretty format 手动执行此
  • Jetty '{servlet}/{parameter}' url 路由

    我使用的是码头9 0 3 如何将 www myweb com servlet parameter 等 URL 映射到给定的 servlet 和参数 例如 URL client 12312 将路由到 clientServlet 及其doGet
  • 如何解决返回对象的映射中的待处理承诺?

    这将解决所有承诺 const promises files map filename gt getPdfToPrint output outputDirectory filename replace const res await Prom
  • 查找mysql中整数的排名[重复]

    这个问题在这里已经有答案了 可能的重复 Mysql排名函数 我有以下国家 地区表 country clicks 0 222 66 34 175 1000 45 650 我如何获得 45 个国家 地区的排名 在本例中为 2 订购country
  • 在 driver=new ChromeDriver(); 行上获取“InitationTargetException”异常;

    我正在打开 Chrome 浏览器 并收到异常 InvocationTargetException 几天前代码运行正常 这是我的代码 System setProperty webdriver chrome driver D Automatio
  • 获取数组的所有组合

    我目前正在尝试创建一个函数来获取数组值的所有可能组合 我想出了一个非函数版本 但它仅限于 3 个值 所以我试图用它来创建一个函数 使其变得更强大Dynamic 我尝试搜索 但找不到我想要做的 powershell 示例 我可以找到 PHP
  • 如何从java中的JSONObject获取所有键/子键?

    这是我的 JSONObject per page 3 total 12 data color 98B2D1 year 2000 name cerulean id 1 pantone value 15 4020 color C74375 ye
  • 堆栈中的动态数组?

    它是否正确 这是用 g 3 4 成功编译的 int main int x 12 char pz x 这是所有其他问题的组合答案 你现在的代码是not标准C 它is标准C99 这是因为 C99 允许您以这种方式动态声明数组 澄清一下 这也是标
  • 五个按钮保持等距圆周旋转

    我想在半径为 100 的圆 以 120 120 为中心的圆 实际上是正方形视图的中心 即 240 240 的圆周上旋转五个按钮 是否可以这样做 与按钮进行交互它们是旋转的且外观正确 我努力了 x round cx redious cos a
  • Nullable 和 Int32 类型之间未定义 Equal

    我正在编写一个无聊的应用程序来管理患者及其临床病史 我将 SQLite 与 DbLinq 库和 DbMetal 代码生成实用程序结合使用 以下是从底层数据库中提取的生成代码中的两个类 Table Name main Patients pub
  • 比较两个图像以检查它们是否相同

    我有一个带有 ImageView 的配置文件视图 用户可以在其中更改他们的图片 我正在保存我的新旧图像以进行比较 我想知道它们是否相同 所以如果是 我不需要将新的推送到我的服务器 我尝试了这个 但它并没有真正起作用 NSData retur