学习 Go 语言 0x0b:《Go 语言之旅》中练习使用 Image

本文介绍了一个使用Go语言编写的图片生成器。该生成器通过定义自定义的Image结构体实现了image.Image接口,并通过调用pic.ShowImage函数展示生成的图片。文章提供了完整的代码实现及运行示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

★ 题目

https://tour.go-zh.org/methods/25

还记得之前编写的图片生成器吗?我们再来编写另外一个,不过这次它将会返回一个image.Image的实现而非一个数据切片。

定义你自己的Image类型,实现必要的方法并调用pic.ShowImage

Bounds应当返回一个image.Rectangle,例如image.Rect(0, 0, w, h)

ColorModel应当返回color.RGBAModel

At应当返回一个颜色。上一个图片生成器的值v对应于此次的color.RGBA{v, v, 255, 255}

★ 代码

import "golang.org/x/tour/pic"
import "image"
import "image/color"

type Image struct{
    width int
    height int
    pixels [][]uint8
}

func (img Image) Bounds() image.Rectangle {
    return image.Rect(0, 0, img.width, img.height)
}

func (img Image) ColorModel() color.Model {
    return color.RGBAModel
}

func (img Image) At(x, y int) color.Color {
    v := img.pixels[y][x]
    return color.RGBA{v, v, 255, 255}
}

// 这个函数是在『练习使用切片来显示图片』的练习题中原封不动搬过来的
func Pic(dx, dy int) [][]uint8 {
    img := make([][]uint8, dy)
    for i := 0; i < dy; i++ {
        img[i] = make([]uint8, dx)
    }
    for i := 0; i < dy; i++ {
        for j := 0; j < dx; j++ {
            img[i][j] = (uint8)(i^j)
        }
    }
    return img
}

func main() {
    m := Image{256, 256, Pic(256,256)}
    pic.ShowImage(m)
}

输出:
在这里插入图片描述

如果在命令行中执行,输出如下:(我在cygwin中执行的)

$ ./showImage.exe
IMAGE:iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAEwUlEQVR4nOzdQWrcQBSEYY3xxedoOoqP4KUXZkKIF7GIF8K0uuP/A/FTFI9GDAyl4iH0vG2P221zuZrX0+22PR4bYpPPv/8ET9v7+/bxh6DpkpYAmOZHAvz5W7y9bZ8ej/j8n+5LAExTB6DTWgJgmp86wN/X6+s/zMOzlHnz//u8BMA0dQA6rSUApmkPwE/7EgDT1AHotJYAmOaXe4CvrpeXE8OHZy/nO3+18yUApqkD0GktATBNewB+2pcAmKYOQKe1BMA0vQ9gPj0vATBNHYBOawmAadoD8NO+BMA0dQA6rSUApnn6fYCz174PPPzwbOf+3f/pm1/hX4g4OQHWeSajaR0A8SLaA/DTvgTANHUAOq0lAKbpfQDz6XkJgGnqAHRaSwBM0x6An/YlAKapA9BpLQEwTd8HcH76fAmAaeoAdFpLAEzTHoCf9iUApqkD0GktATBN7wOYT89LAExTB6DTWgJgmvYA/LQvATBNHYBOawmAaQ7/PsDo636ffw/fvPz+M3/8Ff6FiJMTYJ1nMprWARAvoj0AP+1LAExTB6DTWgJgmt4HMJ+elwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0fQDnp8+XAJimDkCntQTANO0B+GlfAmCaOgCd1hIA0/Q+gPn0vATANHUAOq0lAKZpD8BP+xIA09QB6LSWAJjm8O8D7PvAww/Pdu7f/Z+++RX+hYiTE2CdZzKa1gEQL6I9AD/tSwBMUweg01oCYJreBzCfnpcAmKYOQKe1BMA07QH4aV8CYJo6AJ3WEgDT9H0A56fPlwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0PoD59LwEwDR1ADqtJQCmaQ/AT/sSANPUAei0lgCY5vDvA7hcK18SANPUAei0lgCYpj0AP+1LAExTB6DTWgJgmt4HMJ+elwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0fQDnp8+XAJimDkCntQTANO0B+GlfAmCaOgCd1hIA0/Q+gPn0vATANHUAOq0lAKZpD8BP+xIA09QB6LSWAJjm8O8D7PvAww/Pdu7f/Z+++RX+hYiTE2CdZzKa1gEQL6I9AD/tSwBMUweg01oCYJreBzCfnpcAmKYOQKe1BMA07QH4aV8CYJo6AJ3WEgDT9H0A56fPlwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0PoD59LwEwDR1ADqtJQCmaQ/AT/sSANPUAei0lgCY5vDvA4y+7vf59/DNy+8/88df4V+IODkB1nkmo2kdAPEi2gPw074EwDR1ADqtJQCm6X0A8+l5CYBp6gB0WksATNMegJ/2JQCmqQPQaS0BME3fB3B++nwJgGnqAHRaSwBM0x6An/YlAKapA9BpLQEwTe8DmE/PSwBMUweg01oCYJr2APy0LwEwTR2ATmsJgGkO/z7Avg88/PBs5/7d/+mbX+FfiDg5AdZ5JqNpHQDxItoD8NO+BMA0dQA6rSUApul9APPpeQmAaeoAdFpLAEzTHoCf9iUApqkD0GktATBN3wdwfvp8CYBp6gB0WksATNMegJ/2JQCmqQPQaS0BME3vA5hPz0sATFMHoNNaAmCa9gD8tC8BME0dgE5rCYBp/goAAP//2P/knmJmg90AAAAASUVORK5CYII=

转换后,存成图片: 生成的 img.png 跟上图一样。

$ echo -n "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAEwUlEQVR4nOzdQWrcQBSEYY3xxedoOoqP4KUXZkKIF7GIF8K0uuP/A/FTFI9GDAyl4iH0vG2P221zuZrX0+22PR4bYpPPv/8ET9v7+/bxh6DpkpYAmOZHAvz5W7y9bZ8ej/j8n+5LAExTB6DTWgJgmp86wN/X6+s/zMOzlHnz//u8BMA0dQA6rSUApmkPwE/7EgDT1AHotJYAmOaXe4CvrpeXE8OHZy/nO3+18yUApqkD0GktATBNewB+2pcAmKYOQKe1BMA0vQ9gPj0vATBNHYBOawmAadoD8NO+BMA0dQA6rSUApnn6fYCz174PPPzwbOf+3f/pm1/hX4g4OQHWeSajaR0A8SLaA/DTvgTANHUAOq0lAKbpfQDz6XkJgGnqAHRaSwBM0x6An/YlAKapA9BpLQEwTd8HcH76fAmAaeoAdFpLAEzTHoCf9iUApqkD0GktATBN7wOYT89LAExTB6DTWgJgmvYA/LQvATBNHYBOawmAaQ7/PsDo636ffw/fvPz+M3/8Ff6FiJMTYJ1nMprWARAvoj0AP+1LAExTB6DTWgJgmt4HMJ+elwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0fQDnp8+XAJimDkCntQTANO0B+GlfAmCaOgCd1hIA0/Q+gPn0vATANHUAOq0lAKZpD8BP+xIA09QB6LSWAJjm8O8D7PvAww/Pdu7f/Z+++RX+hYiTE2CdZzKa1gEQL6I9AD/tSwBMUweg01oCYJreBzCfnpcAmKYOQKe1BMA07QH4aV8CYJo6AJ3WEgDT9H0A56fPlwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0PoD59LwEwDR1ADqtJQCmaQ/AT/sSANPUAei0lgCY5vDvA7hcK18SANPUAei0lgCYpj0AP+1LAExTB6DTWgJgmt4HMJ+elwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0fQDnp8+XAJimDkCntQTANO0B+GlfAmCaOgCd1hIA0/Q+gPn0vATANHUAOq0lAKZpD8BP+xIA09QB6LSWAJjm8O8D7PvAww/Pdu7f/Z+++RX+hYiTE2CdZzKa1gEQL6I9AD/tSwBMUweg01oCYJreBzCfnpcAmKYOQKe1BMA07QH4aV8CYJo6AJ3WEgDT9H0A56fPlwCYpg5Ap7UEwDTtAfhpXwJgmjoAndYSANP0PoD59LwEwDR1ADqtJQCmaQ/AT/sSANPUAei0lgCY5vDvA4y+7vf59/DNy+8/88df4V+IODkB1nkmo2kdAPEi2gPw074EwDR1ADqtJQCm6X0A8+l5CYBp6gB0WksATNMegJ/2JQCmqQPQaS0BME3fB3B++nwJgGnqAHRaSwBM0x6An/YlAKapA9BpLQEwTe8DmE/PSwBMUweg01oCYJr2APy0LwEwTR2ATmsJgGkO/z7Avg88/PBs5/7d/+mbX+FfiDg5AdZ5JqNpHQDxItoD8NO+BMA0dQA6rSUApul9APPpeQmAaeoAdFpLAEzTHoCf9iUApqkD0GktATBN3wdwfvp8CYBp6gB0WksATNMegJ/2JQCmqQPQaS0BME3vA5hPz0sATFMHoNNaAmCa9gD8tC8BME0dgE5rCYBp/goAAP//2P/knmJmg90AAAAASUVORK5CYII=" | base64.exe -d > img.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值