From 7cf965b1f5fbbebbc894a56c03501eced77894d1 Mon Sep 17 00:00:00 2001 From: vanitasvitae Date: Tue, 28 Apr 2015 22:47:56 +0200 Subject: [PATCH] Added Base64Wrapper to support different Base64 Implementaions (like android). Also added some functionality for android compatibility --- DepthMapNeedle.jar | Bin 15917 -> 17563 bytes src/ArrayUtils.java | 47 ++++---- src/Base64Wrapper.java | 9 ++ src/Const.java | 86 +++++++------- src/DepthMapNeedle.java | 103 ++++++++++------ src/HexUtil.java | 33 ++++-- src/IO.java | 17 +-- src/JPEG.java | 257 ++++++++++++++++++++++++++-------------- src/JPEGUtils.java | 237 ++++++++++++++++++++---------------- 9 files changed, 480 insertions(+), 309 deletions(-) create mode 100644 src/Base64Wrapper.java diff --git a/DepthMapNeedle.jar b/DepthMapNeedle.jar index e85e0d782fa1d825c64857ddc2f9d50ff4d5beb6..e15fc243fe01cfff0dcd46d6361347541326a01f 100644 GIT binary patch delta 13613 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 src.length) return false; - for(int i=0; i src.length) return false; + for (int i = 0; i < part.length; i++) { - if(part[i] != src[i+offset]) return false; + if (part[i] != src[i+offset]) return false; } return true; } /** * converts the byte array b into a char array by casting all the bytes into chars + * * @param b byte array * @return char array */ public static char[] bytesToChars(byte[] b) { char[] c = new char[b.length]; - for(int i=0; i>> 24), - (byte)(value >>> 16), - (byte)(value >>> 8), - (byte)value}; + public static final byte[] intToByteArray(int value) + { + return new byte[]{ + (byte) (value >>> 24), + (byte) (value >>> 16), + (byte) (value >>> 8), + (byte) value}; } /** * convert a signed byte array into an unsigned byte array (sort of) + * * @param b byte array of signed bytes * @return byte array of unsigned bytes */ public static byte[] unsign(byte[] b) { byte[] u = new byte[b.length]; - for(int i=0; i show help text - if(args.length==0 || args[0].equals("-h")) help(); - - //export depthmap - if(args.length >= 2 && args[0].equals("-e")) - { - for(int i=1; i show help text + if (args.length == 0 || args[0].equals("-h")) help(); + + //export depthmap + if (args.length >= 2 && args[0].equals("-d")) + { + for (int i = 1; i < args.length; i++) + { + JPEG image = new JPEG(args[i], wrapper); + if (image.exportDepthMap()) + System.out.println("Depthmap extracted for file "+args[i]+"."); else System.err.println("There is no Depthmap in file "+args[i]); } } - + //export source image - else if(args.length >=2 && args[0].equals("-s")) + else if (args.length >= 2 && args[0].equals("-s")) { - for(int i=1; i= 3 && args[0].equals("-i")) + else if (args.length >= 3 && args[0].equals("-D")) { String depthmap = args[1]; - for(int i=2; i= 3 && args[0].equals("-S")) + { + String source = args[1]; + for (int i = 2; i < args.length; i++) + { + JPEG image = new JPEG(args[i], wrapper); + if (image.injectSourceImage(source)) + System.out.println("Source image injected into file "+args[i]+"."); + else + System.err.println("Something went wrong while injecting "+source+" into "+args[i]+".\nRemember: The first argument has to be a jpg and the following arguments must be jpgs shot with the blur function."); image.save(); } } } - + /** * Show help text */ public static void help() { System.out.println("Welcome to DepthMapNeedle!" - + "\nDepthMapNeedle is a tool to inject or extract depth information in form of depthmaps from photos shot using Google Cameras Blur function." - + "\n" - + "\nAvailable Options:" - + "\n'-e .jpg ... .jpg':" - + "\n Extract the depthmap from the specified photo(s). The depthmaps will be stored with the suffix \"_d.png\"." - + "\n'-s .jpg ... .jpg':" - + "\n Extract the unblurred source image from the photo(s). These files will be stored with the suffix \"_s.jpg\"." - + "\n'-i .png .jpg .jpg':" - + "\n Inject a png file as Depthmap into the following specified jpg files." - + "\n'-h':" - + "\n Show this help text."); + +"\nDepthMapNeedle is a tool to inject or extract depth information in form of depthmaps from photos shot using Google Cameras Blur function." + +"\n" + +"\nAvailable Options:" + +"\n'-d .jpg ... .jpg':" + +"\n Extract the depthmap from the specified photo(s). The depthmaps will be stored with the suffix \"_d.png\"." + +"\n'-s .jpg ... .jpg':" + +"\n Extract the unblurred source image from the photo(s). These files will be stored with the suffix \"_s.jpg\"." + +"\n'-D .png .jpg ... .jpg':" + +"\n Inject a png file as Depthmap into the following specified jpg files." + +"\n'-S .jpg .jpg ... .jpg':" + +"\n Inject an unblurred source image into the following specified jpg files. " + +"\n Note: The unblurred source image is a simple jpg file of the same dimensions as the photos." + +"\n'-h':" + +"\n Show this help text."); } } diff --git a/src/HexUtil.java b/src/HexUtil.java index f7dc06e..dd25e3e 100644 --- a/src/HexUtil.java +++ b/src/HexUtil.java @@ -1,5 +1,4 @@ - import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -7,19 +6,22 @@ public class HexUtil { /** * Print out a byte array in hexadecimal + * * @param bytes array */ public static void printHex(byte[] bytes) { - for(byte b : bytes) System.out.print(byteToHexString(b)); + for (byte b : bytes) System.out.print(byteToHexString(b)); } /** * convert a byte to a hex string + * * @param data array * @return String representation in hex */ - public static String byteToHexString(byte data) { + public static String byteToHexString(byte data) + { StringBuffer buf = new StringBuffer(); buf.append(toHexChar((data >>> 4) & 0x0F)); @@ -27,22 +29,27 @@ public class HexUtil return buf.toString(); } - + /** * convert a integer into a hexadecimal character + * * @param i integer * @return hex char */ - public static char toHexChar(int i) { - if ((0 <= i) && (i <= 9)) { - return (char) ('0' + i); - } else { - return (char) ('a' + (i - 10)); + public static char toHexChar(int i) + { + if ((0 <= i) && (i <= 9)) + { + return (char) ('0'+i); + } else + { + return (char) ('a'+(i-10)); } } - + /** * Generate the md5 digest of the byte array data in hexadecimal + * * @param data array * @return byte array of the md5 digest in hex */ @@ -51,10 +58,10 @@ public class HexUtil try { byte[] md5 = MessageDigest.getInstance("MD5").digest(data); - String m=""; - for(int i=0; i CHUNKSIZE multiple ExtendedXMPBlocks will be generated and concatenated. * Available types: * Const.EXIF, Const.STANDARDXMP, Const.EXTENDEDXMP + * * @param data byte array of data that will be decorated * @param type String declaring the type of header for the block. * @return decorated block @@ -46,49 +46,49 @@ public class JPEGUtils extends Const public static byte[] decorateBlock(byte[] data, String type) { //EXIF Block: 'APP1 + BLOCKLENGTH + EXIF\0\0 + data' - if(type.equals(EXIF)) + if (type.equals(EXIF)) { data = ArrayUtils.concatenate(markEXIF, data); byte[] pre = ArrayUtils.concatenate(markAPP1, genLen(data.length+2)); return ArrayUtils.concatenate(pre, data); } //StandardXMP: 'APP1 + BLOCKLENGTH + http://ns.adobe.com/xap/1.0/\0 + data' - else if(type.equals(STANDARDXMP)) + else if (type.equals(STANDARDXMP)) { data = ArrayUtils.concatenate(markStandardXMP, data); byte[] pre = ArrayUtils.concatenate(markAPP1, genLen(data.length+2)); - return ArrayUtils.concatenate(pre,data); + return ArrayUtils.concatenate(pre, data); } //ExtendedXMP: 'APP1 + BLOCKLENGTH + http://ns.adobe.com/xmp/extension/\0 + MD5 + EXTENDEDLENGTH + EXTENDEDOFFSET + DATAPORTION - else if(type.equals(EXTENDEDXMP)) + else if (type.equals(EXTENDEDXMP)) { byte[] out = new byte[0]; //MD5 checksum is digest of the datacontent byte[] md5 = HexUtil.generateMD5(data); - int i=0; - int blockCount = data.length/CHUNKSIZE; + int i = 0; + int blockCount = data.length / CHUNKSIZE; //decorate blockportions of size CHUNKSIZE - while (i b = new Vector(); - for(int i=0; i