当前位置:   article > 正文

java实现手机图片分类(2021.07.07)_wx_camera_1697109139143.jpg

wx_camera_1697109139143.jpg

背景:

我有整理手机照片的习惯,将手机照片和视频导入到电脑中时的样子是这样的:

github 博客浏览

杂乱无章,影响美感!

有不少照片是以时间戳的方式命名的,如:mmexport1537331635361.jpg尽管可以利用工具进行线上转化,然后再手动命名

这样虽然可以,但是效率虐低,还显得有点愚蠢,于是我想利用代码来进行自动分类,分类后的结果是这样的:

解决办法

  • 将run.bat复制到要进行整理的文件夹下

  • 双击

路径为jar包路径,run.bat 脚本如下:

  1. java -jar D:\MyJava\2021.5_home\6.9-photoTimeGet\demo\target\demo.jar %~dp0
  2.  pause

上面的几个文件就自动被分配到了2个文件夹2018、2021中,文件夹就是他们名称中包含的时间

愉快的解决!

源码

  1. import com.drew.imaging.ImageMetadataReader;
  2.  import com.drew.imaging.ImageProcessingException;
  3.  import com.drew.metadata.Metadata;
  4.  import org.apache.commons.imaging.ImageReadException;
  5.  import org.apache.commons.imaging.ImageWriteException;
  6.  import org.apache.commons.imaging.Imaging;
  7.  import org.apache.commons.imaging.common.ImageMetadata;
  8.  import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
  9.  import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
  10.  import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
  11.  import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
  12.  import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
  13.  import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
  14.  ​
  15.  import java.io.BufferedOutputStream;
  16.  import java.io.File;
  17.  import java.io.FileOutputStream;
  18.  import java.io.IOException;
  19.  import java.text.ParseException;
  20.  import java.text.SimpleDateFormat;
  21.  import java.util.ArrayList;
  22.  ​
  23.  public class M {
  24.  ​
  25.      public static void main(String[] args){
  26.          demo(args[0]);
  27.          System.out.println("memeda... " + args[0]);
  28.          //demo("C:\\Users\\Administrator\\Desktop\\imgdemo\\2020.12-01\\D");
  29.     }
  30.  ​
  31.      public  static void demo(String dirName){
  32.          File file = new File(dirName);
  33.          String[] list = file.list();
  34.  ​
  35.          for (String fileName : list) {
  36.  ​
  37.              try {
  38.                  //将形如以下三类的 直接进行分到月份文件中
  39.                  //wx_20210601_050627、sc_20210703_153148、IMG_20210629_193059
  40.                  if(fileName.startsWith("wx_20") || fileName.startsWith("sc_") || fileName.startsWith("IMG_")|| fileName.startsWith("VID_")){
  41.                      situation3(dirName,fileName);
  42.                 }else
  43.  ​
  44.                      //4.Screenshot_20210206_150129.jpg
  45.                      if(fileName.startsWith("Sc")){
  46.                          int start = 11;
  47.                          situation14(start,dirName,fileName);
  48.                     }
  49.                      //2.mmexport1612178190861.jpg     2021-02-01 19:16:30
  50.                      //3.wx_camera_1617879049583.jpg
  51.                      else if(fileName.startsWith("mm") || fileName.startsWith("wx")){
  52.                          //获取 年月
  53.                          int start = fileName.startsWith("wx")?10:8;
  54.                          situation23(start,dirName,fileName);
  55.                     }
  56.                      //1608219722461.mp4   1608219722461.jpeg
  57.                      else if(fileName.length()==17 || fileName.length()==18){
  58.                          //获取 年月
  59.                          situation23(0,dirName,fileName);
  60.                     }else {
  61.  ​
  62.                          System.out.println("未知类型图片   " + fileName);
  63.                          continue;
  64.                     }
  65.             }catch (Exception e){
  66.                  System.out.println(fileName + "——————"+e);
  67.             }
  68.         }
  69.     }
  70.  ​
  71.      private static void situation3(String dirName, String fileName) {
  72.          //wx_20210601_050627
  73.          //sc_20210703_153148
  74.          //IMG_20210629_193059
  75.          //获取 年月
  76.          String time = fileName.split("_")[1];
  77.          String year = time.substring(0,4);
  78.          String month = time.substring(4,6);
  79.          //创建文件夹
  80.          String newdirName = dirName+"\\"+year+"\\"+month;
  81.          File dirNew = new File(newdirName);
  82.          if(!dirNew.exists()){
  83.              dirNew.mkdirs();
  84.         }
  85.          String absPath = dirName+ "\\" + fileName;
  86.          move_file(absPath,newdirName,fileName,null);
  87.     }
  88.  ​
  89.      //2.mmexport1612178190861.jpg     2021-02-01 19:16:30
  90.      //3.wx_camera_1617879049583.jpg
  91.      private static void situation23(int start,String dirName, String srcName) {
  92.          //获取 年月
  93.          long time2 = new Long(srcName.substring(start,start+13));
  94.  ​
  95.          String timeStr = new SimpleDateFormat("yyyyMMdd_hhMMss").format(time2);
  96.          String year = timeStr.substring(0,4);
  97.          String month = timeStr.substring(4,6);
  98.  //     创建文件夹
  99.          String newdirName = dirName+"\\"+year+"\\"+month;
  100.          File dirNew = new File(newdirName);
  101.          if(!dirNew.exists()){
  102.              dirNew.mkdirs();
  103.         }
  104.          String newFileName = "wx_" + timeStr+srcName.substring(srcName.lastIndexOf("."));
  105.          String absoulteSrcPath = dirName +"\\" + srcName;
  106.          move_file(absoulteSrcPath,newdirName,srcName,newFileName);
  107.     }
  108.  ​
  109.      //4.Screenshot_20210206_150129.jpg
  110.      private static void situation14(int start,String dirName,String fileName) {
  111.  //       String timeStr = fileName.substring(11);
  112.  //     获取 年月
  113.          String year = fileName.substring(start,start+4);
  114.          String month = fileName.substring(start+4,start+6);
  115.  //     创建文件夹
  116.          File dirNew = new File(dirName+"/"+year+"/"+month);
  117.          if(!dirNew.exists()){
  118.              dirNew.mkdirs();
  119.         }
  120.          //Screenshot_20210614_104229_com.google.android.apps.maps
  121.          // 改为 sc_20210614_104229
  122.          //changePicTime(fileAbsPath,timeStr);
  123.          String[] s = fileName.split("_");
  124.          String newFileName = "sc_"+ s[1] + "_" + s[2]+".jpg";
  125.          String fileAbsPath = dirName + "/" + fileName;
  126.          move_file(fileAbsPath,dirNew.getAbsolutePath(),fileName,newFileName);
  127.     }
  128.  ​
  129.      public static String move_file(String absoulteSrcPath, String absoulteDestDir,
  130.                                     String srcFileName,String newFileName){
  131.          //判断当前文件夹下是否有重名的文件
  132.          File file = new File(absoulteSrcPath);
  133.          newFileName = newFileName == null?file.getName():newFileName;
  134.          String[] list = new File(absoulteDestDir).list();
  135.  ​
  136.          if(list!=null && list.length>0){
  137.              ArrayList<String> fileList = new ArrayList<>();
  138.              for (String s : list) {
  139.                  fileList.add(s);
  140.             }
  141.              if(fileList.contains(newFileName)){
  142.                  newFileName = createNewName(fileList,newFileName);
  143.             }
  144.         }
  145.          boolean b = file.renameTo(new File(absoulteDestDir,newFileName));
  146.          if(b){
  147.              System.out.println("成功----- "+srcFileName +" >> " + newFileName);
  148.         }else {
  149.              System.out.println("失败..... " +srcFileName);
  150.         }
  151.          return b?absoulteDestDir+"\\" + newFileName:null;
  152.     }
  153.      //生成不重名的文件名称
  154.      public static String createNewName(ArrayList<String> fileList, String s) {
  155.          String temp = s;
  156.          int count =1;
  157.          while (fileList.contains(temp)){
  158.              temp = s.split("\\.")[0]+"_"+count+"."+s.split("\\.")[1];
  159.              count++;
  160.         }
  161.          return temp;
  162.     }
  163.  }

打包

直接参考这个,有2点需要注意

  • 路径直接选在src下就行

  • main函数要选 src/main下的,不能选择test文件夹下的,不然报错。。

jar包百度云 提取码:6666

待优化,修改拍摄的时间

  1.  //   "C:\\Users\\Administrator\\Desktop\\demo\\d.jpg"
  2.  //   "1999:01:01 01:01:01"
  3.  //   将照片变为 20201006_120000.jpg 命名的照片,同时将照片的拍摄时间修改
  4.  public static void changePicTime(String fileAbsPath,String timeStr){
  5.          String newAbsPath = new File(fileAbsPath).getParent()+"\\"+timeStr.replace(" ","_").replace(":","")+".jpg";
  6.  ​
  7.          //读文件
  8.          File file = new File(fileAbsPath);
  9.          boolean exists = file.exists();
  10.          try {
  11.              //获取ImageMetadata对象实例
  12.              ImageMetadata metadata = Imaging.getMetadata(file);
  13.              //强转为JpegImageMetadata
  14.              JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
  15.              if(jpegMetadata == null){
  16.                  System.out.println(fileAbsPath + " 无法解析该照片...");
  17.                  return;
  18.             }
  19.              //获取TiffImageMetadata
  20.              TiffImageMetadata exif = jpegMetadata.getExif();
  21.              //转换为Tiff的流
  22.              TiffOutputSet out = exif.getOutputSet();
  23.              //获取TiffOutputDirectory
  24.              TiffOutputDirectory exifDirectory = out
  25.                     .getOrCreateExifDirectory();
  26.              //移除拍摄时间
  27.              exifDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
  28.              exifDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED);
  29.              //初始化当前时间
  30.              //String date = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(new Date());
  31.              //添加拍摄时间,格式为yyyy:MM:dd HH:mm:ss
  32.              exifDirectory.add(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, timeStr);
  33.              exifDirectory.add(ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED,timeStr);
  34.              //新建输出流保存文件
  35.  ​
  36.              BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newAbsPath));
  37.              //写图片
  38.              new ExifRewriter().updateExifMetadataLossless(file, bos, out);
  39.  ​
  40.         } catch (ImageReadException e) {
  41.              e.printStackTrace();
  42.         } catch (IOException e) {
  43.              e.printStackTrace();
  44.         } catch (ImageWriteException e) {
  45.              e.printStackTrace();
  46.         }finally {
  47.              file.delete();
  48.         }
  49.     }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/282680
推荐阅读
相关标签
  

闽ICP备14008679号