图片"/>
【Java编程】获取Windows10开机推荐图片
问题引入
有的时候,打开电脑,Windows10开机推荐的图片你是不是也觉得很漂亮,很想保存但是有不知道图片存在哪里?比如这种,属实拍得有点对不起观众,总之挺漂亮的就是了,那我们就来看看如何使用Java将图片进行保存并且使用吧!
1、图片在哪
首先清楚图片路径,图片存放在:
“C:/Users/******/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets”,不清楚的朋友可以面向百度编程,很多你不知道的万能的网友都知道。
里面的内容大概是这么个样子:
2、如何操作
首先得清楚你的目的:将符合条件的文件更改为图片并且添加到某个目录中。
- 筛选图片
文件有大有小,桌面为1920×1080,也就是说我只要这个分辨率的图片; - 更改文件名
肯定要更改为图片格式的文件(.jpg/png等)才能被我们所接受; - 复制到目的文件夹
文件修改后,要存起来,以后作为文档配图文案或者直接作为桌面壁纸也不错。
其次,你头脑里得有个大概的编码思路,按 “提需求 ——> 需求分析” 的步骤来是最科学最有效的,我这里为了防止出错和影响系统本身的文件夹就没有在此文件夹上直接进行修改操作,而是在代码中创建了一个临时文件夹,将 “Assets” 这个文件夹的所有文件复制到临时文件夹 “temp” 中,然后读取文件,把合适分辨率的文件添加到目的文件夹 “dest” 中,最后删除临时文件夹即可,总结起来是:
源文件夹(复制)——>临时(修改和复制)——>目的文件夹——>临时文件夹(删除)。
代码大致就是这个样子:
/*** 将windows开机的壁纸添加到本地图库中* @author ******/
public class Convert {/*** windows的开机推荐壁纸所在目录*/private static final String SRC_PATH = "C:/Users/*****/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets";/*** 要添加的目的路径*/private static final String DES_PATH = "C:/Users/*****/Pictures/Windows壁纸";public static void main(String[] args) {Convert convert = new Convert();convert.start();}/*** 开始创建*/private void start() {/** 1、创建临时文件夹,将源文件夹中所有内容复制过来*/File temp = new File(DES_PATH + File.separator + "temp");for (File file : Objects.requireNonNull(new File(SRC_PATH).listFiles())) {try {FileUtils.copyFileToDirectory(file, temp);} catch (Exception e) {System.out.println("复制源文件夹中文件\"" + file.getName()+ "\"到临时文件夹\"" + temp.getAbsolutePath() + "\"失败!");e.printStackTrace();return;}}/** 2、遍历临时文件夹,改名复制到目的文件夹*/File desFile = new File(DES_PATH);File file1920 = new File(DES_PATH + File.separator + "1920×1080");File file1080 = new File(DES_PATH + File.separator + "1080×1920");for (File file : Objects.requireNonNull(temp.listFiles())) {File[] files1920 = file1920.listFiles(f -> f.getName().endsWith(file.getName() + ".jpg"));File[] files1080 = file1080.listFiles(f -> f.getName().endsWith(file.getName() + ".jpg"));// 判断该文件是否应该添加(是想要的类型并且目的文件夹中未包含该文件)boolean toAdd = isWanted(file) && Objects.requireNonNull(files1920).length == 0 && Objects.requireNonNull(files1080).length == 0;if (toAdd) {File newFile = new File(desFile, file.getName() + ".jpg");if (file.renameTo(newFile)) {try {BufferedImage bi = ImageIO.read(newFile);if (bi.getWidth() == 1920 && bi.getHeight() == 1080) {FileUtils.copyFileToDirectory(newFile, file1920);System.out.println("发现并且新增文件\"" + newFile.getName() + "\"到\"" + file1920.getName() + "\"");}if (bi.getWidth() == 1080 && bi.getHeight() == 1920) {FileUtils.copyFileToDirectory(newFile, file1080);System.out.println("发现并且新增文件\"" + newFile.getName() + "\"到\"" + file1080.getName() + "\"");}// renameTo()方法会新增文件,复制完成后应该删除该方法新建的文件FileUtils.forceDelete(newFile);} catch (Exception e) {e.printStackTrace();}} else {System.out.println("重命名文件\"" + file.getName() + "\"失败,跳过!");}}}/** 3、删除临时文件夹*/try {FileUtils.forceDelete(temp);} catch (IOException e) {System.out.println("删除临时文件夹\"" + temp.getAbsolutePath() + "\"失败!");e.printStackTrace();}}/*** 是否是想要的类型,默认为true* @param file* @return*/private boolean isWanted(File file) {// 判断名称String[] skip = new String[]{"1dsa", "156asd"};List<String> list = Arrays.stream(skip).collect(Collectors.toList());return !list.contains(file.getName());// 判断色彩 TODO}
}
最后,你肯定要对你的代码进行调试,只有调试才能保证基本达到要求和改进代码,比如,某个图片不好看,我不想要,那你可以"isWanted()"方法中将它过滤掉,或者某种图片颜色不好看,也可以过滤掉。
3、结果如何
对于结果,我个人一般认为首先要达到目的,其次要有效率,最后代码要简洁美观。我个人由于工作原因,已经很少用到File及相关工具类了,只是有印象,希望大家尽量用Java8和工具类,因为真的好用,看起来真的赏心悦目,没错我换成了IDEA<手动狗头>。
我是把这个打成了Jar包,添加到了Windows开机自启里面,这样就省得我每次执行这个工具类。具体做法就是使用Maven的打包插件将类打成Jar,然后写个bat批处理文件,最后把这个bat添加到Windows的自启动路径下即可,大概是这样(ProgramData似乎是隐藏文件夹,需要手动让他显示出来):
效果就是你开机解锁之后就会这样(当然你也可以去掉"@pause"让窗口自动关闭,我这里是因为已经暂时没有新图片了):
然后你就会发现你的目的文件夹下多了好多图片,而且都是1920×1080分辨率的,老好看了:
许久不上CSDN,一看都近4年了,公司都换了好几家了,可能最近又要换了,每次上来看到自己写的这些东西,虽然是很基础的东西,但总给我带来不一样轻松感觉,加油。
更多推荐
【Java编程】获取Windows10开机推荐图片
发布评论