选择壁纸图片
以图片或幻灯片指定一张图片或文件夹,具体操作(省略)
使用JAVA从网上下载图片
注 : 这里采用了360 图库 api
import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Random;
public class UrlUtil {
//main
public static void main(String[] args){
try {
//获取壁纸URL string
String imageUrlFor360 = UrlUtil.getImageUrlFor360(5, 0, 200);
//保存替换壁纸
UrlUtil.saveImagePNG(imageUrlFor360,"wallpaper");
//删除缓存壁纸目录
UrlUtil.deleteImage("C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Themes/CachedFiles");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从360API获取图片地址
* @param cid 1:每日精选 5:游戏 6:美女 9:风景
* 10:视觉创意 11:明星影视 12:汽车 14:萌宠动物
* 15:小清新 16:体育 22:军事 26:动漫卡通 30:情感 35:文字
* @param start 起始索引
* @param count 总共取值
* @return
* @throws IOException
*/
public static String getImageUrlFor360(Integer cid,Integer start,Integer count) throws IOException {
URL url = new URL(String.format("http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid=%d&start=%d&count=%d&from=360chrome",cid,start,count));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setUseCaches(false);
conn.setConnectTimeout(5000); // 请求超时5秒
// 设置HTTP头:
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 11; Windows NT 5.1)");
// 判断HTTP响应是否200:
if (conn.getResponseCode() != 200) {
throw new RuntimeException("bad response");
}
// 获取响应内容:
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sbf = new StringBuffer();
String str = "";
while ((str = br.readLine()) != null){
sbf.append(str);
}
JSON parse = JSONUtil.parse(sbf.toString());
Object data =parse.getByPath("data");
//返回的所有图片数据,若需要全部下载,在此进行遍历即可
JSONArray dataArr = JSONUtil.parseArray(data);
int size = dataArr.size();
//随机抽选
Random random = new Random();
int i = random.nextInt(size);
JSONObject o = (JSONObject)dataArr.get(i);
conn.disconnect();
//获取壁纸图片,还有其他格式,查看json尝试
return o.get("url_thumb",String.class);
}
//保存JPG格式
public static void saveImageJPG(String imgUrl,String fileName) throws IOException {
saveImage(imgUrl,fileName,"jpg");
}
//保存PNG格式
public static void saveImagePNG(String imgUrl,String fileName) throws IOException {
saveImage(imgUrl,fileName,"png");
}
/**
* 根据网络图片地址 保存至本地
* @param imgUrl
* @param fileName
* @param type
* @throws IOException
*/
public static void saveImage(String imgUrl,String fileName,String type) throws IOException {
URL url = new URL(imgUrl);
BufferedImage read = ImageIO.read(url);
FileOutputStream fileOutputStream = new FileOutputStream(String.format("你的图片目录/%s.%s",fileName,type));
ImageIO.write(read,type,fileOutputStream);
fileOutputStream.close();
}
/**
* 删除壁纸目录下图片
*/
public static void deleteImage(String imgUrl){
File file = new File(imgUrl);
if(file.exists() && file.isDirectory()){
File[] files = file.listFiles();
for (File f:files) {
f.deleteOnExit();
}
file.delete();
}
}
}
JSON采用了hutool,也可以用coogle和alibaba的,逻辑都是一致的
运行后发现图片已经下载下来却没有切换壁纸,是因为windows中注册表信息没有改变,java没有直接操作系统注册表的操作,于是我们使用cmd命令进行操作。
首先先将程序打成可执行jar包
修改壁纸注册表
@echo off
:: 开始获取管理员权限,要使用管理员账号登录
setlocal
set uac=~uac_permission_tmp_%random%
md "%SystemRoot%\system32\%uac%" 2>nul
if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
echo WScript.Quit >>"%temp%\%uac%.vbs"
"%temp%\%uac%.vbs" /f
del /f /q "%temp%\%uac%.vbs" & exit )
endlocal
:: 切换至jar包路径,运行jar下载 替换壁纸图片
D:
cd 你的路径
java -jar jar包名称
:: 修改注册表信息, 有时候修改频繁 壁纸依旧切换不了
reg add "hkcu\control panel\desktop" /v wallpaper /d "壁纸全路径" /f
RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
echo. & pause
注:注意替换地址
- 如果使用幻灯片,就可以自然等切换时间进行更换,如果是想直接替换,就采用修改注册表的方式
- 我这里用的JDK-8 所以没有使用httpclient,也不知道高版本是否有自带的JSON工具,大家可以自行尝试体会