声明

这俩天在做图片对比的工具,这里将对比的核心功能代码贴上来共同学习,有什么缺点和不足请大家指出,谢谢。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()方法学习,还有其他问题可以互相沟通。

更多相关文章

  1. 麦子学院android开发笔记:Android更换RatingBar图片
  2. android 代码优化:关闭输出日志
  3. Android中访问sdcard路径的几种方式
  4. Android 四种加载方式 standard singleTop singleTask singleIns
  5. Android Intent Filter应用方式讲解
  6. androidのPULL方式解析XML

随机推荐

  1. 在移动端开发中,容易遇到的问题集合。
  2. 【Android(安卓)Studio 4.0.0】高版本And
  3. 虚拟导航(NavigationBar)栏适配
  4. Android(安卓)Native内存泄漏诊断
  5. 2-3-9 RatingBar
  6. cocosCreator打包Android及更换icon
  7. 【Android】自定义Gradle Plugin实现云端
  8. Android上实现一个简单的天气预报APP(二)
  9. Memory & Threading. (Android(安卓)Perf
  10. 在Android中集成FFmpeg