马赛克的原理比较简单,以一个个的颜色块来平铺整个图片,同一个颜色块使用一种颜色,颜色块形状不定,正方形,长方形,六边形,三角形都可以,而颜色块中的颜色就根据算法不同而不同。
原图如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4d0pSqu-1675393994183)(D:\dev\php\magook\trunk\server\md\img\image-20230203110126575.png)]](https://www.kandaoni.com/uploads/202304/12/a9ee977a330c690b.webp)
1、以颜色块第一个点的颜色作为颜色块的颜色
func image21() {
scale := 7
m1, _ := os.Open("./image1.jpg")
defer m1.Close()
img1, _, _ := image.Decode(m1)
img11 := image.NewRGBA(img1.Bounds())
for i := 0; i < img1.Bounds().Max.X; i++ {
for j := 0; j < img1.Bounds().Max.Y; j++ {
if i%scale == 0 && j%scale == 0 {
po := img1.At(i, j)
for m := 0; m < scale; m++ {
for n := 0; n < scale; n++ {
img11.Set(i+m, j+n, po)
}
}
}
}
}
f1, _ := os.Create("./image1-21.jpg")
defer f1.Close()
jpeg.Encode(f1, img11, nil)
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n5PBKP3D-1675393994188)(D:\dev\php\magook\trunk\server\md\img\image-20230203110829055.png)]](https://www.kandaoni.com/uploads/202304/12/63907ca71e09b313.webp)
中间女生的背部这里效果不太好
2、以颜色块中心点的颜色作为颜色块的颜色
func image20() {
scale := 7
m1, _ := os.Open("./image1.jpg")
defer m1.Close()
img1, _, _ := image.Decode(m1)
img11 := image.NewRGBA(img1.Bounds())
x := img1.Bounds().Max.X / scale
y := img1.Bounds().Max.Y / scale
for i := 0; i < x; i++ {
for j := 0; j < y; j++ {
po := img1.At(i*scale+2, j*scale+2)
for m := 0; m < scale; m++ {
for n := 0; n < scale; n++ {
img11.Set(i*scale+m, j*scale+n, po)
}
}
}
}
f1, _ := os.Create("./image1-20.jpg")
defer f1.Close()
jpeg.Encode(f1, img11, nil)
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ft0kdCTP-1675393994190)(D:\dev\php\magook\trunk\server\md\img\image-20230203111050291.png)]](https://www.kandaoni.com/uploads/202304/12/74c34bd896c50e5f.webp)
3、取颜色块内随机像素点最为颜色块的颜色
func image22() {
scale := 7
m1, _ := os.Open("./image1.jpg")
defer m1.Close()
img1, _, _ := image.Decode(m1)
img11 := image.NewRGBA(img1.Bounds())
for i := 0; i < img1.Bounds().Max.X; i++ {
for j := 0; j < img1.Bounds().Max.Y; j++ {
if i%scale == 0 && j%scale == 0 {
d := rand.Intn(scale)
po := img1.At(d+i, d+j)
for m := 0; m < scale; m++ {
for n := 0; n < scale; n++ {
img11.Set(i+m, j+n, po)
}
}
}
}
}
f1, _ := os.Create("./image1-22.jpg")
defer f1.Close()
jpeg.Encode(f1, img11, nil)
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKnbLB0A-1675393994190)(D:\dev\php\magook\trunk\server\md\img\image-20230203111228844.png)]](https://www.kandaoni.com/uploads/202304/12/c6f978d8a126c286.webp)
相对而言,这个的效果要好一些。