看到kindle即将退出中国市场的新闻,才想起来多年前部门抽奖发过几台paper white还在角落里吃灰,拿出来充上电发现还工作良好,似乎除了压泡面还能干些别的,比如用来显示黑白老照片?
要把kindle变成电子相框需要解决几个小问题:
1 让kindle不自动熄屏
kindle如果没越狱没刷diy系统的话,是会10来分钟就熄屏的。不过如果同时也没升级过固件的话,那么老固件是支持在搜索框里面输入指令“~ds”来实现Disable Screensaver也就是关闭锁屏的。
2 裁剪图片。pw的分辨率是1024*768,不过想要全屏显示的话需要把照片制作成电子书。如果要走浏览器路线的话,由于浏览器不支持全屏显示,实际显示区域就只有890*750大小了。为了实现最佳显示效果并同时实现流量或者电子书尺寸的最小化,最好把图片根据自己的需要进行一下批量裁剪压缩。这里我使用了由于不需要其他复杂的图片操作能力,这里我采用了最轻量的图片处理工具images,把input目录里的所有图片先伸缩到长宽之一满幅另一个超出画幅,然后把超出画幅的一边做居中裁剪。以下代码同时裁剪了横幅和竖幅两组图片。最后可以按需要使用其中一组。
代码语言:javascript复制const images = require("images"),fs=require("fs");
const portraitHeight=890,portraitWidth=750,landscapeHeight=portraitWidth,landscapeWidth=portraitHeight;
let org,w,h;
let path = "../input";
let outputPath = "../output";
if(fs.existsSync(outputPath "/portrait")) fs.rmSync(outputPath "/portrait",{recursive:true})
if(fs.existsSync(outputPath "/landscape")) fs.rmSync(outputPath "/landscape",{recursive:true})
fs.mkdirSync(outputPath "/portrait")
fs.mkdirSync(outputPath "/landscape")
let fileList = fs.readdirSync(path);
fileList.forEach(fineName=>{
org = images(path "/" fineName);
let {width,height}=org.size();
//竖幅
w = Math.max(portraitWidth,width*portraitHeight/height);
h = Math.max(portraitHeight,height*portraitWidth/width);
images(org.size(w),(w-portraitWidth)/2,(h-portraitHeight)/2,portraitWidth,portraitHeight).save(outputPath "/portrait/" fineName,{quality:50})
//横幅
w = Math.max(landscapeWidth,width*landscapeHeight/height);
h = Math.max(landscapeHeight,height*landscapeWidth/width);
images(org.size(w),(w-landscapeWidth)/2,(h-landscapeHeight)/2,landscapeWidth,landscapeHeight).save(outputPath "/landscape/" fineName,{quality:70})
})
3 生成电子书
上网百度的话会告诉你把图片都传到各种收费平台上去制作,或者去word、wps上整什么花活儿。其实程序员要干这么点小事还是很简单的:
代码语言:javascript复制const { PDFDocument } =require('pdf-lib');
const fs = require('fs');
const path = "../output/portrait";
let fileList,iterator,pdfDoc;
async function readImg(){
let n = iterator.next()
if(!n.done){
let jpgImage = await pdfDoc.embedJpg(fs.readFileSync(path "/" n.value))
pdfDoc.addPage().drawImage(jpgImage, {
x: 0,
y: 0,
width: jpgImage.width,
height: jpgImage.height,
})
readImg();
}else{
const pdfBytes = await pdfDoc.save()
fs.writeFileSync("portrait.pdf",pdfBytes)
}
}
(async()=>{
pdfDoc = await PDFDocument.create();
fileList = fs.readdirSync(path);
iterator= fileList[Symbol.iterator]();
readImg()
})()
把一个目录的图片都读出来,一个图片一页往一个pdf丢就行了。不过好像只有部分kindle版本支持自动翻页。如果手头的kindle不支持自动翻页的话,还可以用原生浏览器来实现:
3’ 把图片上传到云端,然后用kindle原生浏览器访问,这样就可以让更多人一起欣赏自己搜集的照片了,但是也容易带来一些流量成本。这是另一个话题了。可以用kindle pw原生浏览器直接访问 http://kindle.sou.ac.cn 看看我搜集的照片(由于某些技术原因,尽量不要使用https)。
4 效果