隐藏MacBookPro2021款刘海

在壁纸的顶部添加69像素的黑色条,来达到隐藏刘海的目的

新版MacBookPro已经出来了,到手后发现那个刘海其实还是很影响观感的,身为一个码农必然是不想每次换壁纸还要打开 ps 一张一张去处理的,所以直接百度搜寻一番使用go官方库中的image包实现了图片合成。

或者直接下载:TopNotchhttps://topnotch.app/

推荐另一个壁纸软件:pap.er 在商店搜索即可。

为了美观,这里要求传入图片必须使Mac Book Pro的分辨率,图片缩放剪裁,这里并没有实现,这部分操作建议使用网上的在线工具手动操作,因为人家还提供了选取等操作,挺方便的。

图片分辨率剪裁网站推荐:https://www.gaitubao.com

处理好的图像位于原图同级位置。

package main

import (
	"bytes"
	"errors"
	"image"
	"image/color"
	"image/draw"
	"image/jpeg"
	"image/png"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
)

// 创建指定宽度高度的纯黑背景图片
func createBlackBar(width, height int) image.Image {
	img := image.NewRGBA(image.Rect(0, 0, width, height))
	for x := 0; x < img.Bounds().Dx(); x++ { // 将背景图涂黑
		for y := 0; y < img.Bounds().Dy(); y++ {
			img.Set(x, y, color.Black)
		}
	}
	return img
}

// loadImage 加载图片文件
func loadImage(fileData []byte) (image.Image, error) {
	fileReader := bytes.NewReader(fileData)

	img, _, err := image.Decode(fileReader)
	if err != nil {
		if err.Error() == "image: unknown format" {
			img, err = png.Decode(fileReader)
			if err != nil {
				return nil, err
			}
			return img, nil
		}
		return nil, err
	}
	return img, nil
}

// WallpaperAddTopBar 合成图片
func WallpaperAddTopBar(filePath string) error {

	dirPath, fileName := filepath.Split(filePath)

	file, err := os.Open(filePath)
	if err != nil {
		return err
	}
	fileData, err := ioutil.ReadAll(file)
	if err != nil {
		return err
	}
	_ = file.Close()

	srcImage, err := loadImage(fileData)
	if err != nil {
		return err
	}

	// 14: 3024 x 1964
	// 16: 3456 × 2234
	srcWidth := srcImage.Bounds().Dx()
	srcHeight := srcImage.Bounds().Dy()

	if srcWidth == 3024 || srcWidth == 3456 {
		if srcHeight == 1964 || srcHeight == 2234 {
			// 创建空白图片
			resImg := image.NewRGBA(image.Rect(0, 0, srcWidth, srcHeight))
			// 创建合适宽度的bar
			blackBarImage := createBlackBar(srcWidth, 69)
			// 合并图象
			draw.Draw(resImg, resImg.Bounds(), srcImage, image.Pt(0, 0), draw.Over)
			draw.Draw(resImg, resImg.Bounds(), blackBarImage, image.Pt(0, 0), draw.Over)

			// 写入文件
			newFileName := strings.Split(fileName, ".")[0] + "_bar.jpg"
			newFilePath := filepath.Join(dirPath, newFileName)

			file, err := os.OpenFile(newFilePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
			if err != nil {
				return err
			}

			// 保存生成的图片
			err = jpeg.Encode(file, resImg, &jpeg.Options{Quality: 100})
			if err != nil {
				return err
			}

			err = file.Close()
			if err != nil {
				return err
			}

			return nil
		}
	}
	return errors.New("图片大小不合适,14:3024x1964 16:3456×2234")
}

func main() {
	err := WallpaperAddTopBar("/Users/2f314fb/Downloads/wallhaven-vqow68_3456x2234.png")
	if err != nil {
		panic(err)
	}
}