马赛克的原理比较简单,以一个个的颜色块来平铺整个图片,同一个颜色块使用一种颜色,颜色块形状不定,正方形,长方形,六边形,三角形都可以,而颜色块中的颜色就根据算法不同而不同。
原图如下
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)
}
中间女生的背部这里效果不太好
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)
}
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)
}
相对而言,这个的效果要好一些。