14cead8034aab0e20e402baee87cbe9129db00192Stephen Hinespackage com.android.rs.refocus;
2de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
3de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.content.Context;
4de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.graphics.Bitmap;
5de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.graphics.BitmapFactory;
6de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.os.Environment;
7de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport android.util.Log;
8de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
9de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport java.io.ByteArrayOutputStream;
10de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport java.io.File;
11de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangimport java.nio.ByteBuffer;
12de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
13de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang/**
14de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * Created by xinyiwang on 6/30/15.
15de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang */
16de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangpublic class ImageCompare {
17de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    private static byte[] loadImageByteArray(String file_path) {
18de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        Bitmap bitmap = BitmapFactory.decodeFile(file_path);
19de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        ByteArrayOutputStream stream = new ByteArrayOutputStream();
20de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
21de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        return stream.toByteArray();
22de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
23de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
24de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    public static boolean compareImage(String file1, String file2) {
25de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] first = loadImageByteArray(file1);
26de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] second = loadImageByteArray(file2);
27de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
28de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        for (int i = 0; i < first.length; i++) {
29de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            int v1 = 0xFF & first[i];
30de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            int v2 = 0xFF & second[i];
31de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            int error = Math.abs(v1 - v2);
32de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            if (error > 2) {
33de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang                return false;
34de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            }
35de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        }
36de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        return true;
37de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
38de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
39de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    private static byte[] loadBitmapByteArray(Bitmap bitmap) {
40de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        int bytes = bitmap.getByteCount();
41de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        ByteBuffer buffer = ByteBuffer.allocate(bytes);
42de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        bitmap.copyPixelsToBuffer(buffer);
43de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] array = buffer.array();
44de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        return array;
45de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
46de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
47de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    public static class CompareValue {
48de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      float aveDiff = 0;
49de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang      float diffPercent = 0f;
50de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
51de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
52de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    public static void compareBitmap(Bitmap bitmap1, Bitmap bitmap2, CompareValue result) {
53de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] first = loadBitmapByteArray(bitmap1);
54de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] second = loadBitmapByteArray(bitmap2);
55de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
56de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        int loopCount = first.length > second.length ? second.length : first.length;
57de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
58de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        int diffCount = 0;
59de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        int diffSum = 0;
60de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        for (int i = 0; i < loopCount; i++) {
61de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          int v1 = 0xFF & first[i];
62de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          int v2 = 0xFF & second[i];
63de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          int error = Math.abs(v1 - v2);
64de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          if (error > 0) {
65de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            diffCount++;
66de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            //if (error > result.maxDiff) {
67de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang              //result.maxDiff = error;
68de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            //}
69de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            diffSum += error;
70de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang          }
71de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        }
72de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        result.diffPercent = ((float)diffCount)/first.length;
73de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        result.aveDiff = ((float)diffSum)/first.length;
74de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
75de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
76de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    public static void compareIntermediate(String folder1, String folder2) {
77de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
78de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        String folder_path = folder.getAbsolutePath();
79de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        //String folder_path = "/storage/self/primary/";
80de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        String file_path_1_base = folder_path + "/" + folder1;
81de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        String file_path_2_base = folder_path + "/" + folder2;
82de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        File dir1 = new File(file_path_1_base);
83de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
84de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        for ( File imgFile : dir1.listFiles()) {
85de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang           String file_path_2 = file_path_2_base + "/" + imgFile.getName();
86de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            String file_path_1 = file_path_1_base + "/" + imgFile.getName();
87de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            System.out.println(file_path_1);
88de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            System.out.println(file_path_2);
89de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            boolean same = compareImage(file_path_1, file_path_2);
90de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            if (same) {
91de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang                Log.d("imageCompare:", imgFile.getName() + " is the same!");
92de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            } else {
93de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang                Log.d("imageCompare:", imgFile.getName() + " is different!");
94de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            }
95de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        }
96de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
97de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
98de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    public static void printWrongIndex(String folder1, String folder2, String file, Context mContext) {
99de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
100de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        String folder_path = folder.getAbsolutePath();
101de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        //String folder_path = "/storage/self/primary/";
102de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        String file_path_1 = folder_path + "/" + folder1 + "/" + file;
103de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        String file_path_2 = folder_path + "/" + folder2 + "/" + file;
104de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
105de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
106de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
107de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        Bitmap bitmap1 = BitmapFactory.decodeFile(file_path_1);
108de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
109de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        bitmap1.compress(Bitmap.CompressFormat.PNG, 100, stream1);
110de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] first =  stream1.toByteArray();
111de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
112de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        Bitmap bitmap2 = BitmapFactory.decodeFile(file_path_1);
113de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
114de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        bitmap2.compress(Bitmap.CompressFormat.PNG, 100, stream2);
115de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] second = stream2.toByteArray();
116de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
117de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        int width = bitmap1.getWidth();
118de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        int height = bitmap1.getHeight();
119de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
120de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        byte[] difference = new byte[first.length];
121de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        //System.out.println("Total pixel: " + width * height);
122de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        //System.out.println("intdifference length: " + intdifference.length);
123de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        //System.out.println("byte array length" + first.length);
124de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
125de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        for (int i = 0; i < first.length; i++) {
126de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            int v1 = 0xFF & first[i];
127de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            int v2 = 0xFF & second[i];
128de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            int error = Math.abs(v1 - v2);
129de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            //if (error > 2 ) {
130de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            //    intdifference[i/4] = 0;
131de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            //} else {
132de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            //    intdifference[i/4] = 255;
133de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            //}
134de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang            difference[i] = (byte)(first[i] - second[i]);
135de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        }
136de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
137de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        //Bitmap differenceBitmap = Bitmap.createBitmap(difference, width, height, Bitmap.Config.ARGB_8888);
138de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang
139de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        Bitmap differenceBitmap = BitmapFactory.decodeByteArray(difference,0, difference.length);
140de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        MediaStoreSaver.savePNG(differenceBitmap, "difference", "updateSharp1Difference.png", mContext);
141de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang        System.out.println("difference image saved!");
142de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang    }
143de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang}
144