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

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

原图如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4d0pSqu-1675393994183)(D:\dev\php\magook\trunk\server\md\img\image-20230203110126575.png)]

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值