驱动需要研究市场上目前流行的各种品牌手机的拍照效果,从而提升公司手机相机功能。收集了大量的不同手机的照片照片进行对比,手机对比速度很慢而且容易出错,顺手开发一个工具解决手工录入问题。最终会把不同相机的图片组装成如下图片。

提供灰度柱状图,厂商,曝光参数,光圈,ISO,白平衡,焦距等的对比,以用于比较相机的成象质量。

程序用到了metadata-extractor-2.9.1.jar和xmpcore-5.1.2.jar两个库

代码如下:

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;   /**  * @author tiwson 2010-06-02  *   */
public class FileSearcher {   /**  * 递归查找文件  * @param baseDirName  查找的文件夹路径  * @param targetFileName  需要查找的文件名  * @param fileList  查找到的文件集合  */  public static void findFiles(String baseDirName, String targetFileName, List fileList) {   /**  * 算法简述:  * 从某个给定的需查找的文件夹出发,搜索该文件夹的所有子文件夹及文件,  * 若为文件,则进行匹配,匹配成功则加入结果集,若为子文件夹,则进队列。  * 队列不空,重复上述操作,队列为空,程序结束,返回结果。  */  String tempName = null;   //判断目录是否存在   File baseDir = new File(baseDirName);   if (!baseDir.exists() || !baseDir.isDirectory()){   System.out.println("文件查找失败:" + baseDirName + "不是一个目录!");   } else {   String[] filelist = baseDir.list();   for (int i = 0; i < filelist.length; i++) {   File readfile = new File(baseDirName + "\\" + filelist[i]);   //System.out.println(readfile.getName());   if(!readfile.isDirectory()) {   tempName =  readfile.getName();    if (FileSearcher.wildcardMatch(targetFileName, tempName) || FileSearcher.wildcardMatch("*.JPG", tempName)) {   //匹配成功,将文件名添加到结果集   fileList.add(readfile.getAbsoluteFile());    }   } else if(readfile.isDirectory()){   findFiles(baseDirName + "\\" + filelist[i],targetFileName,fileList);   }   }   }   }   /**  * 通配符匹配  * @param pattern    通配符模式  * @param str    待匹配的字符串  * @return    匹配成功则返回true,否则返回false  */  private static boolean wildcardMatch(String pattern, String str) {   int patternLength = pattern.length();   int strLength = str.length();   int strIndex = 0;   char ch;   for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) {   ch = pattern.charAt(patternIndex);   if (ch == '*') {   //通配符星号*表示可以匹配任意多个字符   while (strIndex < strLength) {   if (wildcardMatch(pattern.substring(patternIndex + 1),   str.substring(strIndex))) {   return true;   }   strIndex++;   }   } else if (ch == '?') {   //通配符问号?表示匹配任意一个字符   strIndex++;   if (strIndex > strLength) {   //表示str中已经没有字符匹配?了。   return false;   }   } else {   if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) {   return false;   }   strIndex++;   }   }   return (strIndex == strLength);   }
/* public static void main(String[] paramert) {   //    在此目录中找文件   String baseDIR = "D:/Pictures - 副本/iPhone 6s";    //    找扩展名为txt的文件   String fileName = "*.jpg";    List resultList = new ArrayList();   FileSearcher.findFiles(baseDIR, fileName, resultList);    if (resultList.size() == 0) {   System.out.println("No File Fount.");   } else {   for (int i = 0; i < resultList.size(); i++) {   System.out.println(resultList.get(i));//显示查找结果。    }   }   }
*/}
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;public class HistogramAnalysisAlg {private BufferedImage srcImage;private BufferedImage histogramImage;private int size = 280;public HistogramAnalysisAlg(BufferedImage srcImage){histogramImage = new BufferedImage(size,size, BufferedImage.TYPE_4BYTE_ABGR);this.srcImage = srcImage;}public BufferedImage getHistogram() {int[] inPixels = new int[srcImage.getWidth()*srcImage.getHeight()];int[] intensity = new int[256];for(int i=0; i<intensity.length; i++) {intensity[i] = 0;}getRGB( srcImage, 0, 0, srcImage.getWidth(), srcImage.getHeight(), inPixels );int index = 0;for(int row=0; row<srcImage.getHeight(); row++) {int ta = 0, tr = 0, tg = 0, tb = 0;for(int col=0; col<srcImage.getWidth(); col++) {index = row * srcImage.getWidth() + col;ta = (inPixels[index] >> 24) & 0xff;tr = (inPixels[index] >> 16) & 0xff;tg = (inPixels[index] >> 8) & 0xff;tb = inPixels[index] & 0xff;int gray = (int)(0.299 * (double)tr + 0.587 * (double)tg + 0.114 * (double)tb);intensity[gray]++;}}// draw XY Axis linesGraphics2D g2d = histogramImage.createGraphics();//g2d.setPaint(Color.BLACK);g2d.setPaint(Color.WHITE);g2d.fillRect(0, 0, size, size);g2d.setPaint(Color.WHITE);g2d.drawLine(5, 250, 265, 250);g2d.drawLine(5, 250, 5, 5);// scale to 200//g2d.setPaint(Color.GREEN);g2d.setPaint(Color.BLACK);int max = findMaxValue(intensity);float rate = 200.0f/((float)max);int offset = 2;for(int i=0; i<intensity.length; i++) {int frequency = (int)(intensity[i] * rate);g2d.drawLine(5 + offset + i, 250, 5 + offset + i, 250-frequency);}// X Axis Gray intensity//g2d.setPaint(Color.RED);g2d.setPaint(Color.BLACK);g2d.drawString("Gray Intensity", 100, 270);return histogramImage;}private int findMaxValue(int[] intensity) {int max = -1;for(int i=0; i<intensity.length; i++) {if(max < intensity[i]) {max = intensity[i];}}return max;}/*** A convenience method for getting ARGB pixels from an image. This tries to avoid the performance* penalty of BufferedImage.getRGB unmanaging the image.*/public int[] getRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {int type = image.getType();if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )return (int [])image.getRaster().getDataElements( x, y, width, height, pixels );return image.getRGB( x, y, width, height, pixels, 0, width );}/*** A convenience method for setting ARGB pixels in an image. This tries to avoid the performance* penalty of BufferedImage.setRGB unmanaging the image.*/public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {int type = image.getType();if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )image.getRaster().setDataElements( x, y, width, height, pixels );elseimage.setRGB( x, y, width, height, pixels, 0, width );}}
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import javax.imageio.ImageIO;import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.Tag;
import com.drew.metadata.exif.ExifDirectoryBase;
import com.drew.metadata.exif.ExifIFD0Directory;
import com.drew.metadata.exif.ExifInteropDirectory;
import com.drew.metadata.exif.ExifSubIFDDirectory;
import com.drew.metadata.exif.ExifThumbnailDirectory;
import com.drew.metadata.jpeg.JpegDirectory;public class PictureTool {public static void main(String[] args) {List[] resultList = new List[5];int k = 0;if (args.length == 0) {File directory = new File(System.getProperty("user.dir"));//设定为当前文件夹File[] childFiles=directory.listFiles();//找出所有子目录 System.out.println("directory="+directory.getPath());for(int i=0; childFiles!=null && i<childFiles.length;i++)  { if(childFiles[i].isDirectory() && childFiles[i].getPath().indexOf("newx") == -1){System.out.println("childFiles1[i]="+i+childFiles[i].getPath());String fileName = "*.jpg";resultList[k] = new ArrayList();FileSearcher.findFiles(childFiles[i].getPath(), fileName, resultList[k]);if (resultList[k].size() == 0) {System.out.println("No File Fount.");} else {for (int j = 0; j < resultList[k].size(); j++) {System.out.println(resultList[k].get(j));// 显示查找结果。}}k++;} }} else {for (int i = 0; i < args.length; i++) {System.out.println(args[i]);// baseDirs[i] = args[i];String fileName = "*.jpg";resultList[i] = new ArrayList();FileSearcher.findFiles(args[i], fileName, resultList[i]);if (resultList[i].size() == 0) {System.out.println("No File Fount.");} else {for (int j = 0; j < resultList[i].size(); j++) {System.out.println(resultList[i].get(j));// 显示查找结果。}}}}if (resultList[0] != null) {for (int i = 0; i < resultList[0].size(); i++) {CreatePics(resultList[0]!=null?((String) resultList[0].get(i).toString()).replaceAll("\\\\", "/"):null, resultList[1]!=null?((String) resultList[1].get(i).toString()).replaceAll("\\\\", "/"):null,resultList[2]!=null?((String) resultList[2].get(i).toString()).replaceAll("\\\\", "/"):null, resultList[3]!=null?((String) resultList[3].get(i).toString()).replaceAll("\\\\", "/"):null, resultList[4]!=null?((String) resultList[4].get(i).toString()).replaceAll("\\\\", "/"):null);}}}static String s_info = ""; static String fontName = "宋体";static int fontStyle = Font.BOLD; static int fontSize = 40;static Color fontColor = Color.GREEN;static int fontX = 10;static int fontY = 10+fontSize;static float fontAlpha = 1.0f;static Graphics2D graphics = null;static BufferedImage bufferedImage = null;static int linenum = 5;public static void CreatePic(String InImg){File file = new File(InImg);try {Image InImage = ImageIO.read(file);int width = InImage.getWidth(null);int height = InImage.getHeight(null);// 将目标图片加载到内存。int w = (int)(width);int h = (int)(height);boolean isBack = (w > 3000);if (isBack){w =  (int)(w*0.5);h = (int)(h*0.5);}bufferedImage = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);graphics = bufferedImage.createGraphics();AffineTransform origXform = graphics.getTransform();AffineTransform newXform = (AffineTransform)(origXform.clone());// center of rotation is center of the panelif (isBack){newXform.setToScale(0.5f, 0.5f);}else{newXform.setToScale(1.0f, 1.0f);}graphics.setTransform(newXform); graphics.drawImage(InImage, 0, 0, null);// Reset to Originalgraphics.setTransform(origXform);if (isBack){graphics.setFont(new Font(fontName, fontStyle, fontSize));}else{graphics.setFont(new Font(fontName, fontStyle, fontSize));//30));}graphics.setColor(fontColor);// 设置水印图片的透明度。graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,fontAlpha));HistogramAnalysisAlg his = new HistogramAnalysisAlg(bufferedImage);AffineTransform at = new AffineTransform();at.scale(1.0f, 0.5f);BufferedImageOp bi = new AffineTransformOp(at, null);graphics.drawImage(his.getHistogram(), bi, 5, 5);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}Metadata metadata;try {String s = file.getName();if (s != null){s_info = "名字:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;/*graphics.setFont(new Font(fontName, fontStyle, 80));graphics.drawString(s_info, 600, 100);graphics.setFont(new Font(fontName, fontStyle, fontSize));*/}metadata = ImageMetadataReader.readMetadata(file);for (Directory directory : metadata.getDirectories()) {s = directory.getString(ExifIFD0Directory.TAG_MAKE);if (s != null){s_info = "厂商:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifIFD0Directory.TAG_SOFTWARE);if (s != null){s_info = "软件:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH);if (s != null){s_info = "宽度:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT);if (s != null){s_info = "高度:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);if (s != null){s_info = "日期时间:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_TIME);if (s != null){/*String[] ss= s.split("/");float s1=Float.valueOf(ss[0]);float s2=Float.valueOf(ss[1]);int s3=Math.round(s2/s1);System.out.println("1/"+s3);*/s_info = "曝光时间:"+ directory.getDescription(ExifSubIFDDirectory.TAG_EXPOSURE_TIME);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_BIAS);if (s != null){s_info = "曝光补偿:"+directory.getDescription(ExifSubIFDDirectory.TAG_EXPOSURE_BIAS);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_MODE);if (s != null){s_info = "曝光模式:"+directory.getDescription(ExifSubIFDDirectory.TAG_EXPOSURE_MODE);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_FNUMBER);if (s != null){s_info = "光圈:"+ directory.getDescription(ExifSubIFDDirectory.TAG_FNUMBER);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getDescription(ExifSubIFDDirectory.TAG_MAX_APERTURE);//directory.getString(ExifSubIFDDirectory.TAG_MAX_APERTURE);if (s != null){s_info = "最大光圈:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_ISO_EQUIVALENT);if (s != null){s_info = "ISO:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_FLASH);if (s != null){s_info = "闪光灯:"+directory.getDescription(ExifSubIFDDirectory.TAG_FLASH);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_FOCAL_LENGTH);if (s != null){s_info = "焦距:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_METERING_MODE);if (s != null){s_info = "测光模式:"+directory.getDescription(ExifSubIFDDirectory.TAG_METERING_MODE);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_WHITE_BALANCE_MODE);if (s != null){s_info = "白平衡:"+directory.getDescription(ExifSubIFDDirectory.TAG_WHITE_BALANCE_MODE);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}}} catch (ImageProcessingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}graphics.dispose();linenum = 5;try {FileOutputStream outImage = new FileOutputStream(file.getParentFile().getParentFile()+"/new"+file.getName());ImageIO.write(bufferedImage, "jpg", outImage);outImage.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }public static void CreatePics(String InImg1, String InImg2, String InImg3,String InImg4, String InImg5) {File file1 = null, file2 = null, file3=null, file4 = null, file5=null;int picNum = 0;if (InImg1 != null) {picNum++;CreatePic(InImg1);File file = new File(InImg1); file1 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg2 != null) {picNum++;CreatePic(InImg2);File file = new File(InImg2); file2 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg3 != null) {picNum++;CreatePic(InImg3);File file = new File(InImg3); file3 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg4 != null) {picNum++;CreatePic(InImg4);File file = new File(InImg4); file4 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg5 != null) {picNum++;CreatePic(InImg5);File file = new File(InImg5); file5 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}try {Image InImage1 = ImageIO.read(file1);int width = InImage1.getWidth(null);int height = InImage1.getHeight(null);bufferedImage = new BufferedImage(width*picNum, height, BufferedImage.TYPE_INT_RGB);graphics = bufferedImage.createGraphics();    graphics.drawImage(InImage1, 0, 0, null);if (file2 != null){Image InImage2 = ImageIO.read(file2);graphics.drawImage(InImage2, width*1, 0, null);}if (file3 != null){Image InImage3 = ImageIO.read(file3);graphics.drawImage(InImage3, width*2, 0, null);}if (file4 != null){Image InImage4 = ImageIO.read(file4);graphics.drawImage(InImage4, width*3, 0, null);}if (file5 != null){Image InImage5 = ImageIO.read(file5);graphics.drawImage(InImage5, width*4, 0, null);}} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}graphics.dispose();try {String name = file1.getName();if (file2 != null){name += file2.getName();}if (file3 != null){name += file3.getName();}if (file4 != null){name += file4.getName();}if (file5 != null){name += file5.getName();}FileOutputStream outImage = new FileOutputStream(file1.getParentFile() + "/newx/" + name);ImageIO.write(bufferedImage, "jpg", outImage);outImage.close();System.out.println("生成合并文件"+name);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import javax.imageio.ImageIO;import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.Tag;
import com.drew.metadata.exif.ExifDirectoryBase;
import com.drew.metadata.exif.ExifIFD0Directory;
import com.drew.metadata.exif.ExifInteropDirectory;
import com.drew.metadata.exif.ExifSubIFDDirectory;
import com.drew.metadata.exif.ExifThumbnailDirectory;
import com.drew.metadata.jpeg.JpegDirectory;public class PictureToolbak {public static void main2(String[] args) {//CreatePic("d:/test/aa.jpg");//CreatePics("d:/test/M98 (1).jpg","d:/test/ma (1).jpg", "d:/test/Y15 (1).jpg",null, null);//CreatePics("d:/test/M98 (2).jpg","d:/test/ma (2).jpg", "d:/test/Y15 (2).jpg",null, null);//CreatePics("d:/test/(1)iphone .JPG","d:/test/(1)M98 .jpg", "d:/test/(1)ma .jpg","d:/test/(1)Y15 .jpg", null);//String[] baseDirs = new String[5];
/*      File directory1 = new File(new File("").getAbsolutePath());//设定为当前文件夹try {System.out.println(directory1.getCanonicalPath());System.out.println(directory1.getAbsolutePath());//获取绝对路径} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//获取标准的路径//directory1 = new File(directory1.getAbsolutePath());File[] childFiles1=directory1.listFiles();//找出所有子目录 for(int i=0; childFiles1!=null && i < childFiles1.length; i++){ System.out.println("childFiles1[i]="+childFiles1[i].getPath());if(childFiles1[i].isDirectory()){System.out.println("childFiles1[i]="+childFiles1[i].getPath());} }
*/List[] resultList = new List[5];int k = 0;if (args.length == 0) {File directory = new File(System.getProperty("user.dir"));//设定为当前文件夹File[] childFiles=directory.listFiles();//找出所有子目录 System.out.println("directory="+directory.getPath());for(int i=0; childFiles!=null && i<childFiles.length;i++)  { if(childFiles[i].isDirectory() && childFiles[i].getPath().indexOf("newx") == -1){System.out.println("childFiles1[i]="+i+childFiles[i].getPath());String fileName = "*.jpg";resultList[k] = new ArrayList();FileSearcher.findFiles(childFiles[i].getPath(), fileName, resultList[k]);if (resultList[k].size() == 0) {System.out.println("No File Fount.");} else {for (int j = 0; j < resultList[k].size(); j++) {System.out.println(resultList[k].get(j));// 显示查找结果。}}k++;} }} else {for (int i = 0; i < args.length; i++) {System.out.println(args[i]);// baseDirs[i] = args[i];String fileName = "*.jpg";resultList[i] = new ArrayList();FileSearcher.findFiles(args[i], fileName, resultList[i]);if (resultList[i].size() == 0) {System.out.println("No File Fount.");} else {for (int j = 0; j < resultList[i].size(); j++) {System.out.println(resultList[i].get(j));// 显示查找结果。}}}}if (resultList[0] != null) {for (int i = 0; i < resultList[0].size(); i++) {CreatePics(resultList[0]!=null?((String) resultList[0].get(i).toString()).replaceAll("\\\\", "/"):null, resultList[1]!=null?((String) resultList[1].get(i).toString()).replaceAll("\\\\", "/"):null,resultList[2]!=null?((String) resultList[2].get(i).toString()).replaceAll("\\\\", "/"):null, resultList[3]!=null?((String) resultList[3].get(i).toString()).replaceAll("\\\\", "/"):null, resultList[4]!=null?((String) resultList[4].get(i).toString()).replaceAll("\\\\", "/"):null);}}
/*      String baseDIR = "D:/Pictures - 副本/iPhone 6s";    String fileName = "*.jpg";    List resultList = new ArrayList();   FileSearcher.findFiles(baseDIR, fileName, resultList);    if (resultList.size() == 0) {   System.out.println("No File Fount.");   } else {   for (int i = 0; i < resultList.size(); i++) {   System.out.println(resultList.get(i));//显示查找结果。    }   }   String baseDIR1 = "D:/Pictures - 副本/M98";    //    找扩展名为txt的文件    List resultList1 = new ArrayList();   FileSearcher.findFiles(baseDIR1, fileName, resultList1);    if (resultList1.size() == 0) {   System.out.println("No File Fount.");   } else {   for (int i = 0; i < resultList1.size(); i++) {   System.out.println(resultList1.get(i));//显示查找结果。    }   }   String baseDIR2 = "D:/Pictures - 副本/MA01";    //    找扩展名为txt的文件     List resultList2 = new ArrayList();   FileSearcher.findFiles(baseDIR2, fileName, resultList2);    if (resultList2.size() == 0) {   System.out.println("No File Fount.");   } else {   for (int i = 0; i < resultList2.size(); i++) {   System.out.println(resultList2.get(i));//显示查找结果。    }   }   String baseDIR3 = "D:/Pictures - 副本/Y15_1";    //    找扩展名为txt的文件   List resultList3 = new ArrayList();   FileSearcher.findFiles(baseDIR3, fileName, resultList3);    if (resultList3.size() == 0) {   System.out.println("No File Fount.");   } else {   for (int i = 0; i < resultList3.size(); i++) {   System.out.println(resultList3.get(i));//显示查找结果。    }   }   //String s = ((String)resultList.get(0).toString()).replaceAll("\\\\","/");//System.out.println(s);//显示查找结果。for (int i= 0; i < resultList.size(); i++){CreatePics(((String)resultList.get(i).toString()).replaceAll("\\\\", "/"),((String)resultList1.get(i).toString()).replaceAll("\\\\", "/"), ((String)resultList2.get(i).toString()).replaceAll("\\\\", "/"),((String)resultList3.get(i).toString()).replaceAll("\\\\", "/"), null);}
*/}static String s_info = ""; static String fontName = "宋体";static int fontStyle = Font.BOLD; static int fontSize = 18;static Color fontColor = Color.GREEN;static int fontX = 10;static int fontY = 10+fontSize;static float fontAlpha = 1.0f;static Graphics2D graphics = null;static BufferedImage bufferedImage = null;static int linenum = 5;public static void CreatePic(String InImg){File file = new File(InImg);try {Image InImage = ImageIO.read(file);int width = InImage.getWidth(null);int height = InImage.getHeight(null);// 将目标图片加载到内存。int w = (int)(width*0.5f);int h = (int)(height*0.5f);bufferedImage = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);graphics = bufferedImage.createGraphics();AffineTransform origXform = graphics.getTransform();AffineTransform newXform = (AffineTransform)(origXform.clone());// center of rotation is center of the panelnewXform.setToScale(0.5f, 0.5f);graphics.setTransform(newXform); graphics.drawImage(InImage, 0, 0, null);// Reset to Originalgraphics.setTransform(origXform);//graphics.drawImage(InImage, 0, 0, width, height, null);graphics.setFont(new Font(fontName, fontStyle, fontSize));graphics.setColor(fontColor);// 设置水印图片的透明度。graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,fontAlpha));HistogramAnalysisAlg his = new HistogramAnalysisAlg(bufferedImage);AffineTransform at = new AffineTransform();at.scale(0.5f, 0.25f);BufferedImageOp bi = new AffineTransformOp(at, null);graphics.drawImage(his.getHistogram(), bi, 5, 5);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}Metadata metadata;try {String s = file.getName();if (s != null){s_info = "名字:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}metadata = ImageMetadataReader.readMetadata(file);for (Directory directory : metadata.getDirectories()) {s = directory.getString(ExifIFD0Directory.TAG_MAKE);if (s != null){s_info = "厂商:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifIFD0Directory.TAG_SOFTWARE);if (s != null){s_info = "软件:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH);if (s != null){s_info = "宽度:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT);if (s != null){s_info = "高度:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);if (s != null){s_info = "日期时间:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_TIME);if (s != null){/*String[] ss= s.split("/");float s1=Float.valueOf(ss[0]);float s2=Float.valueOf(ss[1]);int s3=Math.round(s2/s1);System.out.println("1/"+s3);*/s_info = "曝光时间:"+ directory.getDescription(ExifSubIFDDirectory.TAG_EXPOSURE_TIME);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_BIAS);if (s != null){s_info = "曝光补偿:"+directory.getDescription(ExifSubIFDDirectory.TAG_EXPOSURE_BIAS);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_MODE);if (s != null){s_info = "曝光模式:"+directory.getDescription(ExifSubIFDDirectory.TAG_EXPOSURE_MODE);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_FNUMBER);if (s != null){s_info = "光圈:"+ directory.getDescription(ExifSubIFDDirectory.TAG_FNUMBER);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getDescription(ExifSubIFDDirectory.TAG_MAX_APERTURE);//directory.getString(ExifSubIFDDirectory.TAG_MAX_APERTURE);if (s != null){s_info = "最大光圈:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_ISO_EQUIVALENT);if (s != null){s_info = "ISO:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_FLASH);if (s != null){s_info = "闪光灯:"+directory.getDescription(ExifSubIFDDirectory.TAG_FLASH);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_FOCAL_LENGTH);if (s != null){s_info = "焦距:"+s;graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_METERING_MODE);if (s != null){s_info = "测光模式:"+directory.getDescription(ExifSubIFDDirectory.TAG_METERING_MODE);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}s = directory.getString(ExifSubIFDDirectory.TAG_WHITE_BALANCE_MODE);if (s != null){s_info = "白平衡:"+directory.getDescription(ExifSubIFDDirectory.TAG_WHITE_BALANCE_MODE);graphics.drawString(s_info, fontX, fontY+linenum*fontSize);linenum++;}}} catch (ImageProcessingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}graphics.dispose();linenum = 5;try {FileOutputStream outImage = new FileOutputStream(file.getParentFile().getParentFile()+"/new"+file.getName());ImageIO.write(bufferedImage, "jpg", outImage);outImage.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }public static void CreatePics(String InImg1, String InImg2, String InImg3,String InImg4, String InImg5) {File file1 = null, file2 = null, file3=null, file4 = null, file5=null;int picNum = 0;if (InImg1 != null) {picNum++;CreatePic(InImg1);File file = new File(InImg1); file1 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg2 != null) {picNum++;CreatePic(InImg2);File file = new File(InImg2); file2 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg3 != null) {picNum++;CreatePic(InImg3);File file = new File(InImg3); file3 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg4 != null) {picNum++;CreatePic(InImg4);File file = new File(InImg4); file4 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}if (InImg5 != null) {picNum++;CreatePic(InImg5);File file = new File(InImg5); file5 = new File(file.getParentFile().getParentFile()+"/new"+file.getName());}try {Image InImage1 = ImageIO.read(file1);int width = InImage1.getWidth(null);int height = InImage1.getHeight(null);bufferedImage = new BufferedImage(width*picNum, height, BufferedImage.TYPE_INT_RGB);graphics = bufferedImage.createGraphics();    graphics.drawImage(InImage1, 0, 0, null);if (file2 != null){Image InImage2 = ImageIO.read(file2);graphics.drawImage(InImage2, width*1, 0, null);}if (file3 != null){Image InImage3 = ImageIO.read(file3);graphics.drawImage(InImage3, width*2, 0, null);}if (file4 != null){Image InImage4 = ImageIO.read(file4);graphics.drawImage(InImage4, width*3, 0, null);}if (file5 != null){Image InImage5 = ImageIO.read(file5);graphics.drawImage(InImage5, width*4, 0, null);}} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}graphics.dispose();try {String name = file1.getName();if (file2 != null){name += file2.getName();}if (file3 != null){name += file3.getName();}if (file4 != null){name += file4.getName();}if (file5 != null){name += file5.getName();}FileOutputStream outImage = new FileOutputStream(file1.getParentFile() + "/newx/" + name);ImageIO.write(bufferedImage, "jpg", outImage);outImage.close();System.out.println("生成合并文件"+name);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

手机相机图像对比工具开发相关推荐

  1. 计算机视觉中的图像标注工具总结

    本文来自公众号CV技术指南资源分享系列 创建高质量的数据集是任何机器学习项目的关键部分.在实践中,这通常比实际训练和超参数优化花费的时间更长.因此,选择合适的标注工具至关重要.在这里,我们总结了一些用 ...

  2. android 图像对比,图像对比在UI自动化中的应用

    引子 继多版本模拟器的支持工作告一段落之后,如何利用这些技术产生更大的价值,成为了接下来需要思考的问题.当然,接下来的课题就涉及到了今天的图像对比技术.说来有点内疚,虽然也算是科班出身,只可惜大学还没 ...

  3. 推荐5最佳免费图像注释工具

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 图像标注是有监督机器学习中的数据标注技术之一,要做图像注释,必须需 ...

  4. 『原创』+『参考』基于PPC的图像对比程序——使用直方图度量

    前言的前言: 最近小弟闲来无聊,就想到了在PPC上面来做个图像对比的小东东,查找各方资料,终于在今天初步完成了这个程序,现在整理之后和各位共勉.程序中还存在很多不足之处,大家尽管提出自己的意见和建议, ...

  5. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件签名 )

    文章目录 一.生成 jks 文件 二.签名命令 三.执行结果 四.处理 Unsupported major.minor version 52.0 错误 参考博客 : [Android 安全]DEX 加 ...

  6. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )

    文章目录 一.apk 对齐操作 二.apk 对齐命令 三.apk 对齐操作代码示例 四.apk 对齐执行结果 参考博客 : [Android 安全]DEX 加密 ( 常用 Android 反编译工具 ...

  7. 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )

    文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...

  8. 【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )

    文章目录 一.生成 dex 文件 二.生成 dex 文件代码示例 三.生成 dex 结果 参考博客 : [Android 安全]DEX 加密 ( 常用 Android 反编译工具 | apktool ...

  9. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

    文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...

最新文章

  1. python时间处理模块 datetime time模块 deltetime模块
  2. C++中的日期和时间
  3. (转)正则表达式语法备忘录
  4. 计算机组成原理实验箱使能开关,计算机组成原理微程序计数器实验报告
  5. SAP官方发布的ABAP编程规范
  6. 牛客网数据开发题库_数据库刷题—牛客网(21-30)
  7. 图片图层隐写_【软件】imageIN · 图影-隐藏文件到图片,简单轻快的图片隐写工具...
  8. 【转账】API自动化测试
  9. Spring Boot Actuator监控端点小结
  10. JAVA系统学习之三大版本JavaSE、javaEE、javaME
  11. 统计学权威盘点过去50年最重要的统计学思想
  12. 牛年第一瓜!阿里女员工被初中文化男子骗走500多万!开豪车连骗12名女性,被判无期!...
  13. unity 3d水的资源包_使用Apple LiDAR,一小时为你家量身打造3D游戏
  14. 计算机中的同步和异步
  15. oracle使用with递归查询
  16. php 集成 spss,〖SPSS Modeler〗 IBM SPSS Modeler 整合不同数据库之间的数据
  17. 华为云弹性云服务器助力打造更安全可靠、灵活高效的云空间
  18. 今日头条 爬虫 java_Java爬虫实践:Jsoup+HttpUnit爬取今日头条、网易、搜狐、凤凰新闻...
  19. $STRM 空投和 Strategy Stakers 代币分配
  20. 编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)

热门文章

  1. matlab 添加路径和工具箱
  2. 只读存储器和闪速存储器
  3. APP开发成本如何计算?
  4. Robei设计中的小技巧(最后一次更新)
  5. Volley网络框架分享
  6. Smart Fuzzing智能模糊测试
  7. 惊爆!Python打造花式照片墙!
  8. cvCvtColor的用法
  9. POI 单元格格式化 - 数据格式化
  10. java不能作为整型常量_以下字符组合中,不能作为Java整型常量的是_学小易找答案...