gpt4 book ai didi

Golang exercise slice 如何处理大值

转载 作者:数据小太阳 更新时间:2023-10-29 03:05:51 25 4
gpt4 key购买 nike

我正在阅读 Golang 教程,我对它对 slice 练习中的某些值的作用有点困惑。 https://tour.golang.org/moretypes/18

这是我混淆的代码:

值 0 是完美的蓝色像素,值 255 是完美的白色像素。那么当显示的值是某种形式的 x*y 时,这里发生了什么(我做了 /20 以使图像更大并且更容易看到)。

如果你水平地跟随图像,你会看到在这个过程中的某个时刻,不断增加的 x 和 y 值似乎恢复为蓝色(0 值)如果我输入一个静态值,如 256 在返回中我得到一个编译错误。所以它显然不允许数字超出范围并恢复为 0 或任何值。那么图片中的蓝色曲线是怎么得到的呢?

此处导入源代码:https://github.com/golang/tour/blob/master/pic/pic.go#L15

package main

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

func Pic(dx, dy int) [][]uint8 {
//First, the array has to be made so we can put some values in it later
//This only makes the second dimension of the array ([[uint8 dy]])?
image := make([][]uint8, dy)

//The inputs into the function are Int's, so it is ok to have a non uint8
//loop initializer
for x := 0; x < dy; x++ {
//once we are in the loop we have to make the first dimension of the array
//based on the dx values
image[x] = make([]uint8, dx)
for y := 0; y < dx; y++ {
//This is a function +to assign the pixel values to the array
image[x][y] = uint8((x * y) /20)
}
}
return image
}

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

最佳答案

想象 i类型为 int , uint8(i)返回 Least Significant Byte (LSB)i :

x[0, 255] 范围内,意思是:0 <= x <= 255
y在 [0, 255] 范围内,
然后 x*y[0, 255*255] = [0, 65025] 范围内
所以x*y/20[0, 255*255/20] = [0, 65025/20] = [0, 3251] 范围内
uint8(x*y/20) 的值等于(x*y/20)%256确切的含义是 LSB 字节:
uint8(3251) = uint8(0XCB3) = 0XB3 = 179
3251 = 12*256 + 179

所以每次 x*y/20大于 255 再次从 0 开始计数:(x*y/20) % 256这就是为什么你的图片是重复的圆圈。

试试这个有效的示例代码:

package main

import "fmt"

func main() {
for y := 0; y <= 255; y++ {
for x := 0; x <= 255; x++ {
v := x * y / 20
if int(uint8(v)) != v%256 {
fmt.Println(v, v%256)
}
}
}
fmt.Println("Done.")
}

输出:

Done.

让我们简化你的例子,看看这个工作示例代码:

package main

import (
"bytes"
"image"
"image/png"
"os"
)

func main() {
const dx = 256
const dy = 256
m := image.NewNRGBA(image.Rect(0, 0, dx, dy))
for y := 0; y < dy; y++ {
for x := 0; x < dx; x++ {
v := uint8(x * y / 20)
i := y*m.Stride + x*4
m.Pix[i] = v //R
m.Pix[i+1] = v //G
m.Pix[i+2] = 255 //B
m.Pix[i+3] = 255 //A
}
}
var buf bytes.Buffer
err := png.Encode(&buf, m)
if err != nil {
panic(err)
}
os.Stdout.Write(buf.Bytes())
}

并将输出重定向到一个文件,如main > b.png或者,go run main.go > b.png
查看输出文件 b.png :
enter image description here

关于Golang exercise slice 如何处理大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com