【导读】Kindle 用户福利!本文中作者介绍了如何使用 Go 程序方便地处理 PDF 电子书。
用Kindle看自己的电子书,需要以邮件的方式发送到自己的Kindle的邮箱里,其中电子书作为该邮件的附件。这个附件的要求是直接附件,不能是云附件。大部分邮箱对附件的处理是当附件的大小大于某个值时(如:大于30M)则作为云附件进行发送。作为云附件发送的电子书,Kindle的回复是:您发送至Kindle的邮件未附任何文件附件。
人在湖北农村,儿女学习需要电子书,学校提供了微信免费版。但限于网速,常常无法加载(每次打开都需要重新加载),所以无法正常使用,只好另作处理。我的处理方法是:首先,将微信版的电子书下载下来(这里不讲这个);其次,打包成PDF发送到我的Kindle;最后,从Kindle看(只需要下载一次)。由于邮箱与Kindle的限制,需要压缩图片。
处理图片,首先当然想到的是Photoshop,设置好存储动作,然后使用批处理。但我现在没有,所以自己来写一个。
写这种小程序,首先想到的Go与Python,我决定用Go。
处理方法很简单,记录下来的原因有两个。一个是:PNG图片的大小与色彩的多少有关,当然也与色彩分布的复杂度也有关。另一个是:Mac中图片集转PDF需要有一个笔记。
> image
main.go
package main
import (
"fmt"
"image"
"image/color"
"image/png"
"log"
"math"
"os"
)
var path = "image/root画板 %d@3x.png"
func main() {
// 按顺序读取所有图片。
for i := 1; i < 201; i++ {
// 原图片文件路径。
f := fmt.Sprintf(path, i)
// 打开源图片文件。
source := sourceImage(f)
// 打开目标图片文件
target := targetImage(i)
// 将源图片文件另存为目标图片文件。
saveAs(source, target)
}
}
// 新建目标图片文件。
func targetImage(i int) *os.File {
file, err := os.Create(fmt.Sprintf("%d.png", i))
if err != nil {
log.Fatal(err)
}
return file
}
// 打开原图片文件。
func sourceImage(image string) *os.File {
file, err := os.Open(image)
if err != nil {
log.Fatal(err)
}
return file
}
func saveAs(source, target *os.File) bool {
// 延迟关闭文件源。
defer source.Close()
defer target.Close()
// 解码源图片文件内容。
s, err := png.Decode(source)
if err != nil {
log.Fatal(err)
}
// 获取源图片的大小。
bounds := s.Bounds()
w := bounds.Max.X
h := bounds.Max.Y
// 新建一个Image。
grayScale := image.NewGray(image.Rectangle{image.Point{0, 0}, image.Point{w, h}})
for x := 0; x < w; x++ {
for y := 0; y < h; y++ {
// 将每个点的颜色转为指定灰度。
input := s.At(x, y)
g := formatGray(input)
// 写入灰度值。
grayScale.Set(x, y, g)
}
}
// 编码新的图片内容。
err = png.Encode(target, grayScale)
if err != nil {
log.Fatal(err)
}
return true
}
// 彩色转灰度。
func formatGray(input color.Color) color.Color {
rr, gg, bb, _ := input.RGBA()
// 注意,1. 不是(R + G + B)/3; 2. 未对alpha进行处理。
r := math.Pow(float64(rr), 2.2)
g := math.Pow(float64(gg), 2.2)
b := math.Pow(float64(bb), 2.2)
m := math.Pow(0.2125*r+0.7154*g+0.0721*b, 1/2.2)
Y := uint16(m + 0.5)
bit := uint8(Y >> 8)
bit = simplifyGray(bit)
grayColor := color.Gray{bit}
return grayColor
}
// 简化灰度为5阶。
func simplifyGray(i uint8) uint8 {
if i > 224 {
return 255
}
if i > 192 {
return 224
}
if i > 160 {
return 192
}
if i > 128 {
return 160
}
return 0
}
在Mac里将图片集转为PDF,比较方便。
转自:
zhuanlan.zhihu.com/p/112393604
- EOF -
Go 开发大全
参与维护一个非常全面的Go开源技术资源库。日常分享 Go, 云原生、k8s、Docker和微服务方面的技术文章和行业动态。
关注后获取
回复 Go 获取6万star的Go资源库
分享、点赞和在看
支持我们分享更多好文章,谢谢!