声明

这俩天在做图片对比的工具,这里将对比的核心功能代码贴上来共同学习,有什么缺点和不足请大家指出,谢谢。Lee出品,转载请注明出处:http://blog.csdn.net/hnulwt/article/details/43668161

前言

我采用图片比较的方式是通过像素点逐个对比的方式来进行的。由于android内存大小的限制,我们可能 在做图片对比的时候还要考虑内存的问题,因为较大图片加载上来可能会导致OOM。网上查了查,绝大多数是使用压缩图片质量来达到目的的。

不过本文并未针对图片大小本身做考虑,因为目前需要对比的图片不是足够大,如果有遇到特别大图片且需要对比,那么接下来可能会考虑一定的优化方案(目前大致考虑了一下,如果图片过大,可以继续试着拆分每行的像素值,进一步让int[]变小。但是如果图片过大,获取bitmap就OOM的话,了解到可以通过获取图片大小的方式,并非直接加载图片到内存中,可以尝试这种方式,不过目前没有研究过,在次权当讨论),也就会写博客进一步记录如何优化的。

代码解释

本段代码主要是通过逐行获取bitmap的像素点来进行对比的,最终返回的是图片的相似度(若俩张图片大小不一致,则直接返回大小不一致)。

代码

import java.text.DecimalFormat;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

public class BitmapCompare

{

private static final String DIFFERENT_SIZE = "differentSize";

private static final String RESULT_FORMAT = "00.0%";

public static String similarity(String url1, String url2) {

Bitmap bm1 = BitmapFactory.decodeFile(url1);

Bitmap bm2 = BitmapFactory.decodeFile(url2);

return similarity(bm1, bm2);

}

public static String similarity(Bitmap bm1, Bitmap bm2) {

final int bm1Width = bm1.getWidth();

final int bm2Width = bm2.getWidth();

final int bmHeight = bm1.getHeight();

if (bmHeight != bm2.getHeight() || bm1Width != bm2Width)

return DIFFERENT_SIZE;

int[] pixels1 = new int[bm1Width];

int[] pixels2 = new int[bm2Width];

reset();

for (int i = 0; i < bmHeight; i++) {

bm1.getPixels(pixels1, 0, bm1Width, 0, i, bm1Width, 1);

bm2.getPixels(pixels2, 0, bm2Width, 0, i, bm2Width, 1);

comparePixels(pixels1, pixels2, bm1Width);

}

return percent(Count.sT, Count.sF + Count.sT);

}

private static void comparePixels(int[] pixels1, int[] pixels2, int length) {

for (int i = 0; i < length; i++) {

if (pixels1[i] == pixels2[i]) {

Count.sT++;

} else {

Count.sF++;

}

}

}

private static String percent(int divisor, int dividend) {

final double value = divisor * 1.0 / dividend;

DecimalFormat df = new DecimalFormat(RESULT_FORMAT);

return df.format(value);

}

private static void reset() {

Count.sT = 0;

Count.sF = 0;

}

private static class Count {

private static int sT;

private static int sF;

}

}

尾声

在图片比较过程中,最为暴力的方式就是直接获取整张图片的像素值,放到int[]数组中,然后进行对比,当然这种方式缺点明显,不用多说。上面代码中,bitmap.getPixel方法其实还是需要研究一下的,如有不懂,请戳:bitmap.getPixel()方法学习,还有其他问题可以互相沟通。

android 图片相似度比对,Android图片对比(图片相似度)代码相关推荐

  1. android让图片旋转动画,利用RotateAnimation旋转图片的问题 - 移动平台 / Android

    利用RotateAnimation旋转一个图片,当动画停止时,如何让被旋转的图片保持旋转结束时的状态,而不是回到初始图片状态. 更详细一点说就是,我有一张图片,利用RotateAnimation旋转, ...

  2. Android进阶之路 - 解决部分手机拍照之后图片被旋转的问题

    这几天犯了一个错误,初期想着甩锅给后台的- 但还好及时发现了是自身的问题~ 关联文章 Android基础进阶 - 调用拍照.获取图片(基础) Android基础进阶 - 获取.调用相册内图片(基础) ...

  3. android 手势放缩_Android应用中实现手势控制图片缩放的完全攻略

    一.概述现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~ 我相信看图的整个步骤,大家或者说用户应 ...

  4. Android动态修改选中和不选中的Button图片颜色

    需求: 标题可能不太容易让人理解,直接看图吧: 比如这三个Button,选中的时候图片是蓝色,不选中的时候图片是白色.正常情况下,切图要切两套,一张白底,一张蓝底.可如果UI只给你白底呢?那么也只能代 ...

  5. android 视频默认图片格式,Android获取视频文件某一帧并设置图片

    在项目中,有时候需要抓取视频文件的某一帧图像做为预览图片,那到底应该怎么获取这个图片呢? Android为我们提供了一个统一的接口用来获取多媒体文件的相关信息:MediaMetadataRetriev ...

  6. android 图片在哪里设置时间,android 按时间显示图片

    实现效果: 首先写需要用到的图片数据:时间.文件名.路径等 package com.example.a550211.cd; import java.text.SimpleDateFormat; imp ...

  7. 【Android 安装包优化】WebP 图片格式兼容与性能 ( Android 中的 WebP 图片格式兼容问题 | Android 中的 WebP 图片格式性能 )

    文章目录 一.Android 中的 WebP 图片格式兼容问题 二.Android 中的 WebP 图片格式性能 三.参考资料 一.Android 中的 WebP 图片格式兼容问题 在 Android ...

  8. 【Android 内存优化】Bitmap 内存占用计算 ( Bitmap 图片内存占用分析 | Bitmap 内存占用计算 | Bitmap 不同像素密度间的转换 )

    文章目录 一.Bitmap 内存占用 二.Bitmap 内存占用计算示例 三.Bitmap 内存占用与像素密度 四.Bitmap 内存占用与像素密度示例 一.Bitmap 内存占用 在 Android ...

  9. android自定义相机预览尺寸,相机在Android中,如何获得最佳尺寸,预览尺寸,图片尺寸,视图尺寸,图像扭曲...

    混合来自OpenGL和 Android相机的视图时图像失真,以便在使用takepicture方法时获取两者的图像.我查了一下,发现相机图片设置为640X480,openGL视图和相机预览都设置为128 ...

最新文章

  1. java initcause_Java 异常
  2. 微信 服务器地址的有效性,C# 微 信 公众平台 验证服务器地址的有效性
  3. 如何去掉桌面标签背影
  4. 【我的项目经验】——Visual Studio 插件
  5. storyboard或者Xib给View设置边框属性(颜色,宽度,圆角)
  6. python无法调用pygame,python-pycharm无法识别pygame程序包
  7. 按钮点击_如何设置微信小程序按钮点击事件?
  8. c/c++笔试面试题(4)
  9. oracle 找不到程序,Oracle 找不到监听程序
  10. spring p2p项目html,springboot2.x项目实战视频教程p2p金融中等项目
  11. cocos2d-x 使用BMFont生成中文字体并应用
  12. ST-LINK驱动的安装(有图 超详细)
  13. ps教程全套|零基础教程-高阶教程快速入门
  14. 用windows电脑制作macos系统安装U盘
  15. 用MicroPython开发ESP32-文件传输工具-ampy
  16. qPCR检测基因表达的引物数据库
  17. 八进制换算成二进制、十进制、十六进制
  18. 开题报告中的研究目的与研究内容怎么写?
  19. AD账号导入--dsadd user
  20. 局域网,广域网,城域网

热门文章

  1. 谁说中文不能编程了?快看文言文大战东北话
  2. flutter 处理前置摄像头拍出来的图片翻转问题,截取正方形图片问题
  3. 58888元一晚套房已售罄,国庆预计6亿人次出游
  4. 如何在苹果官网下载旧版本的Xcode
  5. liunx 谷歌浏览器清空缓存命令
  6. 微信小程序 - 实现 <video> 视频组件自定义封面及播放按钮,给 video 视频播放组件加上封面图、封面标题、封面描述文字、自定义的播放按钮、DIY 封面等(详细示例源码)
  7. exsyexcel合并单元格
  8. linux删除历史操作命令
  9. Dubbo基础知识_1
  10. python如何并发上千个get_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘...