Skip to content

Commit

Permalink
文档优化,逻辑调整
Browse files Browse the repository at this point in the history
  • Loading branch information
bihe0832 committed Jun 2, 2017
1 parent 4229457 commit 2a2318c
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 183 deletions.
60 changes: 47 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,44 @@
## 简介

一款简单的照片整理的工具,主要用于查看照片的基本信息以及将多个不同目录的照片合并在一起。
### 背景

最近在将各种云、各种设备上的照片统一在一起,结果发现遇到几个问题:

1. 由于不停的来回拷贝过,导致部分照片重复了(不是相似,是完全相同)
2. 由于拍摄来源不同,导致照片的名称很混乱,不方便浏览
3. 由于拍摄来源不同,导致有可能是不同的照片但是文件名相同

基于上面的原因,想把所有的照片整理一遍发现工程量巨大,尤其是当照片有60+G的时候。本来想网上找个工具,但是不太放心,因此最终自己写了一个简单的照片整理工具。

### 产品功能

PhotoManager主要有以下功能:

1. 查看照片的基本信息,包括大小(占用空间、像素大小)、拍摄时间、地点、海拔、使用设备等
2. 整理不同目录的照片,将不同目录的照片逐个合并到相同目录。合并过程中会

1. 将所有照片按照拍摄时间重新命名,对于无法获取到拍摄时间的照片,保留原名称,例如:

2013-03-09_11-51-23.JPG

2. 对于文件名相同的照片,通过MD5检查是否为相同照片,如果是,则删除重复照片;如果不是,则在文件名后面增加序号

2013-03-09_11-51-23-[1].JPG
2013-03-09_11-51-23-[2].JPG

3. **如果照片可以被成功重新命名,在整理到目标目录后,原目录的照片会被删除;如果照片无法被重命名,照片不会被整理,而是保留在原目录**

### 待解决问题

通过上面的问题,初步解决了照片整理的最麻烦的问题,但是还有几个问题没有解决

1. 之前照片上云的时候,发现部分云盘私自压缩了照片,导致即使同一张照片,MD5并不相同,合并时都会被保留

2. 有时候会使用连拍等方式,导致会有很多很相似的照片,这部分照片其实可以选择后保留一张

3. 由于压缩、截图、保存等方式有几率会丢失照片的拍摄时间、地点等信息,这部分照片无法自动归类和整理

这几个问题都只能通过一些其他算法来对比优化,由于怕出现误删因此没有深入实践,这两个问题,本人打算在浏览照片的时候手动处理。

## 使用事例

Expand All @@ -9,8 +47,7 @@
➜ PhotoManager git:(master) ✗ java -jar ./managePhoto.jar
usage:

java -jar ./managePhoto.jar --<show|manage> [filePath]
java -jar ./managePhoto.jar --version
java -jar ./managePhoto.jar --<show|manage> [sourceFilePath] [targetFilePath] java -jar ./managePhoto.jar --version
java -jar ./managePhoto.jar --help

such as:
Expand Down Expand Up @@ -48,26 +85,23 @@

### 整理照片

➜ PhotoManager git:(master) ✗ java -jar ./managePhoto.jar --manage /Volumes/Document/Document/temp/1/ /Volumes/Document/Document/temp/5/
➜ PhotoManager git:(master) ✗ java -jar ./managePhoto.jar --manage /Volumes/Document/Document/temp/5/ /Volumes/Document/Document/temp/1/


******************************************************
照片整理已经开始……
如果照片较多,持续时间较长,请耐心等待。
整理过程中您可以在目标目录实时查看整理效果


正在努力整理中,已完成: /Volumes/Document/Document/temp/1/目录下 5 张照片


正在努力整理中,已完成: /Volumes/Document/Document/temp/5/ 目录下 5 张照片

******************************************************
照片整理结果如下:共计从: /Volumes/Document/Document/temp/1/整理了 8 张照片,其中:
照片整理结果如下:共计从: /Volumes/Document/Document/temp/5/ 整理了 8 张照片到/Volumes/Document/Document/temp/1/,其中:
整理成功: 8 张
: 0 张为已经存在的照片
: 8 张已经按时间重新命名
: 0 张保留了原名称
: 0 张照片为已经存在的照片
: 8 张照片已经按时间重新命名
整理失败: 0 张
: 0 张照片没有找到
: 0 张照片解析时间错误,需要手动整理
: 0 张照片解析时间错误放弃整理,需要手动整理
: 0 张照片因为无法重命名放弃整理,需要手动整理
******************************************************
Binary file modified managePhoto.jar
Binary file not shown.
113 changes: 0 additions & 113 deletions managePhoto/README.md

This file was deleted.

86 changes: 50 additions & 36 deletions managePhoto/src/com/bihe0832/photo/getPhotoInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ public class getPhotoInfo {

private static final int RESULT_FAIL_NOT_FOUND = -1;
private static final int RESULT_FAIL_COPY_EXCEPTION = -2;
private static final int RESULT_FAIL_NOINFO = -3;
private static final int RESULT_SUCC_RENAME = 1;
private static final int RESULT_SUCC_NOINFO = 2;
private static final int RESULT_SUCC_SAME = 3;
private static final int RESULT_SUCC_SAME = 2;


private static final ArrayList<String> IMG_PREFIX_LIST = new ArrayList<String>(Arrays.asList("jpg","jpeg","png"));
Expand Down Expand Up @@ -98,25 +98,35 @@ private static void showPhotoInfo(String filepath){
}

private static void copyPhoto(String sourceFolder,String targetFolder){
if(null != sourceFolder && sourceFolder.length() > 0){
sourceFolder = sourceFolder + "/";
}else{
System.out.println("要整理的照片文件夹:" + sourceFolder + " 不存在");
return;
}

if(null != targetFolder && targetFolder.length() > 0){
targetFolder = targetFolder + "/";
}else{
System.out.println("整理后保存照片的文件夹:" + targetFolder + " 不存在");
return;
}

int succRename = 0;
int succNoInfo = 0;
int failNoInfo = 0;
int succSame = 0;
int failNotFound = 0;
int failException = 0;
System.out.println(
"\n\n******************************************************\n"+
"照片整理已经开始……\n"+
"\t如果照片较多,持续时间较长,请耐心等待。\n"+
"\t整理过程中您可以在目标目录实时查看整理效果\n\n");
"\t整理过程中您可以在目标目录实时查看整理效果");
File[] listFiles = new File(sourceFolder).listFiles();
for(File f: listFiles){
if(f.isFile() ){
if(IMG_PREFIX_LIST.contains(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf(".") + 1).toLowerCase())){
switch(copyPhotoOnce(f.getAbsolutePath(),targetFolder)){
case RESULT_SUCC_NOINFO:
succNoInfo++;
f.delete();
break;
case RESULT_SUCC_RENAME:
succRename++;
f.delete();
Expand All @@ -131,9 +141,12 @@ private static void copyPhoto(String sourceFolder,String targetFolder){
case RESULT_FAIL_COPY_EXCEPTION:
failException++;
break;
case RESULT_FAIL_NOINFO:
failNoInfo++;
break;
}
if((succRename + succNoInfo + succSame + failNotFound + failException)%5 == 0){
System.out.println("正在努力整理中,已完成: "+ sourceFolder + "目录下 "+ (succRename + succNoInfo + succSame + failNotFound + failException) +" 张照片\n");
if((succRename + succSame + failNoInfo + failNotFound + failException)%5 == 0){
System.out.println("\n正在努力整理中,已完成: "+ sourceFolder + "目录下 "+ (succRename + failNoInfo + succSame + failNotFound + failException) +" 张照片\n");
}
}
}else if(f.isDirectory()){
Expand All @@ -142,15 +155,15 @@ private static void copyPhoto(String sourceFolder,String targetFolder){
}

System.out.println(
"\n\n******************************************************\n"+
"照片整理结果如下:共计从: "+ sourceFolder + "整理了 "+ (succRename + succNoInfo + succSame + failNotFound + failException) +" 张照片,其中:\n"+
"整理成功: "+ (succRename + succNoInfo + succSame) + " 张\n"+
"\t: "+ succSame + " 张为已经存在的照片\n"+
"\t: "+ succRename + " 张已经按时间重新命名\n"+
"\t: "+ succNoInfo + " 张保留了原名称\n"+
"整理失败: "+ (failNotFound + failException) + " 张\n"+
"******************************************************\n"+
"照片整理结果如下:共计从: "+ sourceFolder + " 整理了 "+ (succRename + succSame + failNoInfo + failNotFound + failException) +" 张照片到 "+ targetFolder +",其中:\n"+
"整理成功: "+ (succRename + succSame) + " 张,其中\n"+
"\t: "+ succSame + " 张照片为已经存在的照片\n"+
"\t: "+ succRename + " 张照片已经按时间重新命名\n"+
"整理失败: "+ (failNotFound + failException + failNoInfo) + " 张,其中\n"+
"\t: "+ failNotFound + " 张照片没有找到\n"+
"\t: "+ failException + " 张照片解析时间错误,需要手动整理\n"+
"\t: "+ failException + " 张照片解析时间错误放弃整理,需要手动整理\n"+
"\t: "+ failNoInfo + " 张照片因为无法重命名放弃整理,需要手动整理\n"+
"******************************************************\n"
);
}
Expand All @@ -168,27 +181,28 @@ private static int copyPhotoOnce(String sourcePath,String targetFolder){
if(photoInfo.getDateTimeOriginal().length() > 0){
targetBasePath = targetFolder + photoInfo.getDateTimeOriginal();
result = RESULT_SUCC_RENAME;
targetBasePath = targetBasePath.replace(":","-").replace(" ","_");
String targetPath = targetBasePath;
do{
targetPath = targetPath + "."+ prefix;
targetImg = new File(targetPath);
if(targetImg.exists()){
String targetImgMd5= getFileMD5(targetImg);
String sourceImgMd5= getFileMD5(sourceImg);
if(targetImgMd5.equalsIgnoreCase(sourceImgMd5)){
targetImg.delete();
result = RESULT_SUCC_SAME;
}
}
imgNum++;
targetPath = targetBasePath +"-[" + imgNum+ "]";
}while(targetImg.exists());
Files.copy(sourceImg.toPath(),targetImg.toPath());
}else{
targetBasePath = targetFolder + sourceImg.getName().substring(0,sourceImg.getName().lastIndexOf("."));
result = RESULT_SUCC_NOINFO;
result = RESULT_FAIL_NOINFO;
}
targetBasePath = targetBasePath.replace(":","-").replace(" ","_");
String targetPath = targetBasePath;
do{
targetPath = targetPath + "."+ prefix;
targetImg = new File(targetPath);
if(targetImg.exists()){
String targetImgMd5= getFileMD5(targetImg);
String sourceImgMd5= getFileMD5(sourceImg);
if(targetImgMd5.equalsIgnoreCase(sourceImgMd5)){
targetImg.delete();
result = RESULT_SUCC_SAME;
}
}
imgNum++;
targetPath = targetBasePath +"-[" + imgNum+ "]";
}while(targetImg.exists());
Files.copy(sourceImg.toPath(),targetImg.toPath());

} catch (Exception e) {
System.out.println("照片:" + sourcePath + " 整理失败" );
e.printStackTrace();
Expand Down
39 changes: 18 additions & 21 deletions managePhoto/src/com/bihe0832/photo/help.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,24 @@ such as:
拍摄时使用设备: Apple (iPhone 6)
******************************************************

java -jar ./managePhoto.jar --manage /Volumes/Document/Document/temp/1/ /Volumes/Document/Document/temp/5/
java -jar ./managePhoto.jar --manage /Volumes/Document/Document/temp/5/ /Volumes/Document/Document/temp/1/

the result will be such as:

******************************************************
照片整理已经开始……
如果照片较多,持续时间较长,请耐心等待。
整理过程中您可以在目标目录实时查看整理效果


正在努力整理中,已完成: /Volumes/Document/Document/temp/1/目录下 5 张照片



******************************************************
照片整理结果如下:共计从: /Volumes/Document/Document/temp/1/整理了 8 张照片,其中:
整理成功: 8 张
: 0 张为已经存在的照片
: 8 张已经按时间重新命名
: 0 张保留了原名称
整理失败: 0 张
: 0 张照片没有找到
: 0 张照片解析时间错误,需要手动整理
******************************************************
******************************************************
照片整理已经开始……
如果照片较多,持续时间较长,请耐心等待。
整理过程中您可以在目标目录实时查看整理效果

正在努力整理中,已完成: /Volumes/Document/Document/temp/5/ 目录下 5 张照片

******************************************************
照片整理结果如下:共计从: /Volumes/Document/Document/temp/5/ 整理了 8 张照片到/Volumes/Document/Document/temp/1/,其中:
整理成功: 8 张
: 0 张照片为已经存在的照片
: 8 张照片已经按时间重新命名
整理失败: 0 张
: 0 张照片没有找到
: 0 张照片解析时间错误放弃整理,需要手动整理
: 0 张照片因为无法重命名放弃整理,需要手动整理
******************************************************

0 comments on commit 2a2318c

Please sign in to comment.