golang中的图像image处理之马赛克效果

马赛克的原理比较简单,以一个个的颜色块来平铺整个图片,同一个颜色块使用一种颜色,颜色块形状不定,正方形,长方形,六边形,三角形都可以,而颜色块中的颜色就根据算法不同而不同。

原图如下

golang中的图像image处理之马赛克效果_第1张图片

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)
}

golang中的图像image处理之马赛克效果_第2张图片

中间女生的背部这里效果不太好

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)
}

golang中的图像image处理之马赛克效果_第3张图片

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)
}

golang中的图像image处理之马赛克效果_第4张图片

相对而言,这个的效果要好一些。

你可能感兴趣的:(golang,golang)