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