go语言slice切片以及生产base64的图片

利用slice切边生成了一个数组,然后将这个数组转成base64编码的图片,通过os.Create去生成图片。

package main

import (
	"bytes"
	"encoding/base64"
	"fmt"
	"image"
	"image/png"
	"io"
	"math"
	"os"
)

type alg_type int8

const (
	meanType alg_type = iota
	multiType
	powType
	myType1
)

func Show(dx, dy int, etype alg_type, file io.Writer) {
	data := Pic(dx, dy, etype)

	m := image.NewNRGBA(image.Rect(0, 0, dx, dy))

	for y := 0; y < dy; y++ {
		for x := 0; x < dx; x++ {
			v := data[y][x]
			i := y*m.Stride + x*4
			m.Pix[i] = v
			m.Pix[i+1] = v
			m.Pix[i+2] = 255
			m.Pix[i+3] = 255
		}
	}

	err := png.Encode(file, m)
	if err != nil {
		fmt.Println(err)
		panic(err)
	}

	ShowImage(m)
}

func ShowImage(m image.Image) {
	var buf bytes.Buffer

	err := png.Encode(&buf, m)
	if err != nil {
		panic(err)
	}
	enc := base64.StdEncoding.EncodeToString(buf.Bytes())
	fmt.Println("IMAGE:" + enc)
}

func Pic(dx, dy int, etype alg_type) [][]uint8 {
	var slTemp [][]uint8

	slTemp = make([][]uint8, dy)
	for ix := range slTemp {
		slTemp[ix] = make([]uint8, dx)
	}

	slx := slTemp
	for ix := range slx {
		sly := slx[ix]
		for iy := range sly {
			switch etype {
			case meanType:
				sly[iy] = uint8((ix*ix + iy*iy) / 2)
			case multiType:
				sly[iy] = uint8(ix * iy)
			case powType:
				sly[iy] = uint8(math.Pow(float64(ix), float64(iy)))
			case myType1:
				sly[iy] = uint8(ix * (iy + 1))
			default:
				sly[iy] = uint8(ix * (iy - 1))
			}
		}
		slx[ix] = sly
	}

	return slTemp
}

func getFileName(t alg_type) string {
	switch t {
	case meanType:
		return "mean.png"
	case multiType:
		return "multi.png"
	case powType:
		return "pow.png"
	case myType1:
		return "my1.png"
	default:
		return "test.png"
	}

}

func main() {
	const (
		dx = 256
		dy = 256
	)

	file, err := os.Create(getFileName(meanType))
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	Show(dx, dy, meanType, file)
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值