1. 引言
首页的图片每天都是重样的是在是看得心烦意乱,就希望每次访问网页都能看到不一样的风景,既然是用Typora+PicGo写博客,图片通过JSDlivr全球分发(其实是心疼CDN的钱,毕竟每个月又拍云才给15G),那么我就直接通过一个简单的php实现访问GitHub中的随机图片不就能实现简单的随机图API了嘛?
说干就干,咳咳,我们理一下思路:
- 先找到我们需要的随机图<赛博朋克风格随机图32张>
- 通过大名鼎鼎的tingpng实现压缩,毕竟图片1080P就够了,还有手机用户呢
- 通过PicGo上传到GitHub,输出加速后的图片地址
- 部署到服务器中,并通过API调用
2. 实现
图片我们已经准备好了,把这些图片上传到Tinypng,可以看到压缩率为70%,还是比较夸张的,我这里下载的图片都是1920×1080分辨率,如果分辨率不太好的话可以用OpenCV压缩一下,代码如下:
import os
import cv2
file_path = "你的文件目录"
web_path = "上传的CDN目录"
def img_resize(image_path):
image = cv2.imread(file_path+image_path)
height, width = image.shape[0], image.shape[1]
# 设置新的图片分辨率框架
width_new = 1920
height_new = 1080
# 判断图片的长宽比率
if width / height >= width_new / height_new:
img = cv2.resize(image, (width_new, int(height * width_new / width)))
else:
img = cv2.resize(image, (int(width * height_new / height), height_new))
if ".jpg" in image_path:
cv2.imwrite(file_path+image_path, img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
elif ".png" in image_path:
cv2.imwrite(file_path+image_path, img, [cv2.IMWRITE_PNG_COMPRESSION, 0])
if __name__ == '__main__':
filelist = os.listdir(file_path)
with open('目录/img.txt','w') as f:
for file in filelist:
img_resize(file)
f.write(web_path+file+'\n')
此时,img.txt中就会包含我们上传到GitHub后分发的文件地址了,格式为:https://cdn.jsdelivr.net/gh/用户名/仓库名/文件名.jpg/png
,把文件保存好,后续我们需要使用。
已经把文件保存到img.txt
文件中了,现在我们可以配置random.php
文件了。
<?php
//存有美图链接的文件名img.txt
$filename = "img.txt";
if(!file_exists($filename)){
die('文件不存在');
}
//从文本获取链接
$pics = [];
$fs = fopen($filename, "r");
while(!feof($fs)){
$line=trim(fgets($fs));
if($line!=''){
array_push($pics, $line);
}
}
//从数组随机获取链接
$pic = $pics[array_rand($pics)];
//返回指定格式
$type=$_GET['type'];
switch($type){
//JSON返回
case 'json':
header('Content-type:text/json');
die(json_encode(['pic'=>$pic]));
default:
die(header("Location: $pic"));
}
?>
好了,接下来我们访问一下试试:
哈哈哈哈,其实没什么问题,我们只要配置一下HTTPS证书就好了,提示的是后端不健康!
3. 总结
至此,已经全部配置完成了,访问我的个人博客reid.run就可以看到首页随机图都换成了赛博朋克风,一个小遗憾是忘记把水印关掉了,后续再上传的话我会注意的!
我的赛博朋克 api:https://api.reid.run/random.php
博客运行效果:https://reid.run
后续会写一个自动化的Python3随机api,这样的配置实在是太繁琐了~
Q.E.D.