tour.golang.org#36 pic.Show 实现的功能

huangapple go评论159阅读模式
英文:

tour.golang.org#36 The functionality implemented by pic.Show

问题

在这个例子中,pic.Show(Pic)语句的作用是将通过Pic函数生成的图像显示出来。Pic函数接受两个参数dxdy,表示图像的宽度和高度。它返回一个二维的uint8类型的切片,表示图像的像素值。pic.Show函数会将这个像素值切片转换为图像并显示出来。

当你运行这个例子时,它会在标准输出上打印一些字符,这些字符实际上是表示图像的文本表示形式。如果你想要在图形界面中显示图像,你可以尝试在本地运行这段代码,或者使用支持图形界面的在线Go编译器。

英文:

In tour.golang.org , exercice 36 , what this statement pic.Show(Pic) supposed to do?

package main

import "code.google.com/p/go-tour/pic"

func Pic(dx, dy int) [][]uint8 {
	var p = make([]([]uint8), dy)
	for i := 0; i < len(p); i++ {
		p[i] = make([]uint8, dx)
		for j := 0; j < len(p[i]); j++ {
			p[i][j] = uint8((i + j) / 2)
		}
	}
	return p
}

func main() {
	pic.Show(Pic)
}

when I run the example, it just print some characters on the standard output, isn’t supposed to show some picture?

答案1

得分: 7

pic.Show() 创建图像并将其编码为 base64。以下是代码:

func Show(f func(int, int) [][]uint8) {
    const (
        dx = 256
        dy = 256
    )
    data := f(dx, dy)
    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
        }
    }
    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)
}

有趣的是,它最终打印出字符串 "IMAGE:",后面跟着 base64 编码的字符串。似乎 play.golang.org 解析输出并将其转换为 img 标签。可以尝试以下示例:http://play.golang.org/p/RZPqp164eS

英文:

pic.Show() creates the image and encodes it as base64. Here is the code:

func Show(f func(int, int) [][]uint8) {
        const (
                dx = 256
                dy = 256
        )
        data := f(dx, dy)
        m := image.NewNRGBA(image.Rect(0, 0, dx, dy))
        for y := 0; y &lt; dy; y++ {
                for x := 0; x &lt; 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
                }
        }
        ShowImage(m)
}

func ShowImage(m image.Image) {
        var buf bytes.Buffer
        err := png.Encode(&amp;buf, m)
        if err != nil {
                panic(err)
        }
        enc := base64.StdEncoding.EncodeToString(buf.Bytes())
        fmt.Println(&quot;IMAGE:&quot; + enc)
}

Funny thing is it ends up printing the string "IMAGE:" followed by the base64 encoded string. Seems that play.golang.org parses the output converting this to an img tag. Try the following example: http://play.golang.org/p/RZPqp164eS

huangapple
  • 本文由 发表于 2013年9月1日 06:06:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/18553246.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定