gpt4 book ai didi

image - 对其进行编码和解码后将所有零成像

转载 作者:行者123 更新时间:2023-12-03 10:08:08 25 4
gpt4 key购买 nike

在编写测试的过程中,我遇到了一个奇怪的行为,当给png.Encode提供随机图像,然后再次使用png.Decode解码给定的字节数组时,它全为零(尽管这是image.NRGBA图像的事实-应该固定以便进行比较)
我在这里为我的代码创建了一个游乐场:https://play.golang.org/p/S6XJLVMOLyQ
但是为了完整起见,示例代码在这里:

package main

import (
"fmt"
"image"
"reflect"
"image/color"
"bytes"
"image/png"
"math/rand"
)

func main() {

width := 5
height := 5

upLeft := image.Point{0, 0}
lowRight := image.Point{width, height}

inImage := image.NewRGBA(image.Rectangle{upLeft, lowRight})

for x := 0; x < width; x++ {
for y := 0; y < height; y++ {

// Colors are defined by Red, Green, Blue, Alpha uint8 values.
randomColor := color.RGBA{
uint8(rand.Intn(255)),
uint8(rand.Intn(255)),
uint8(rand.Intn(255)),
0x00}
inImage.Set(x, y, randomColor)
}
}

out := new(bytes.Buffer)
err := png.Encode(out, inImage)

if err != nil {
panic("Something went wrong")
}

reader := bytes.NewReader(out.Bytes())
outImage, err := png.Decode(reader)

areEqual := reflect.DeepEqual(inImage, outImage)

// Might have to convert it to image.RGBA here - but still all bytes are zero now

fmt.Printf("Are Equal: %s\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", areEqual, inImage, outImage)
}
哪个返回:
Are Equal: %!s(bool=false)

exp: &image.RGBA{Pix:[]uint8{0x56, 0x84, 0x7a, 0x0, 0xef, 0x60, 0x9b, 0x0, 0x10, 0x8a, 0x4d, 0x0, 0xfc, 0x76, 0x5e, 0x0, 0x65, 0x5a, 0xa5, 0x0, 0xfe, 0x97, 0x99, 0x0, 0xa7, 0x83, 0x32, 0x0, 0x92, 0xae, 0xb, 0x0, 0xd6, 0x7b, 0xde, 0x0, 0xab, 0x1, 0x17, 0x0, 0x73, 0x9b, 0x3d, 0x0, 0x42, 0x8f, 0x85, 0x0, 0x48, 0xd3, 0x2d, 0x0, 0x3d, 0x54, 0x81, 0x0, 0xce, 0x6b, 0xf8, 0x0, 0x96, 0x77, 0x97, 0x0, 0xed, 0x25, 0x34, 0x0, 0x9c, 0x67, 0xdc, 0x0, 0xcd, 0xfa, 0x53, 0x0, 0xb0, 0x85, 0x8d, 0x0, 0x2a, 0x3b, 0x58, 0x0, 0xd0, 0xb4, 0x96, 0x0, 0x9a, 0x30, 0x2b, 0x0, 0x12, 0x67, 0xaa, 0x0, 0x89, 0x53, 0xde, 0x0}, Stride:20, Rect:image.Rectangle{Min:image.Point{X:0, Y:0}, Max:image.Point{X:5, Y:5}}}

got: &image.NRGBA{Pix:[]uint8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, Stride:20, Rect:image.Rectangle{Min:image.Point{X:0, Y:0}, Max:image.Point{X:5, Y:5}}}[39m

最佳答案

问题是您绘制了完全透明的像素(alpha = 0),因此在对其进行编码时, png 包将“优化”图像并编码为全黑图像(相同)。
将alpha组件更改为完全不透明的255:

randomColor := color.RGBA{
uint8(rand.Intn(255)),
uint8(rand.Intn(255)),
uint8(rand.Intn(255)),
255} // MAX ALPHA
通过这个简单的更改,输出将是(在 Go Playground上尝试):
Are Equal: true

exp: &image.RGBA{Pix:[]uint8{0x56, 0x84, 0x7a, 0xff, 0xef, 0x60, 0x9b, 0xff, 0x10, 0x8a, 0x4d, 0xff, 0xfc, 0x76, 0x5e, 0xff, 0x65, 0x5a, 0xa5, 0xff, 0xfe, 0x97, 0x99, 0xff, 0xa7, 0x83, 0x32, 0xff, 0x92, 0xae, 0xb, 0xff, 0xd6, 0x7b, 0xde, 0xff, 0xab, 0x1, 0x17, 0xff, 0x73, 0x9b, 0x3d, 0xff, 0x42, 0x8f, 0x85, 0xff, 0x48, 0xd3, 0x2d, 0xff, 0x3d, 0x54, 0x81, 0xff, 0xce, 0x6b, 0xf8, 0xff, 0x96, 0x77, 0x97, 0xff, 0xed, 0x25, 0x34, 0xff, 0x9c, 0x67, 0xdc, 0xff, 0xcd, 0xfa, 0x53, 0xff, 0xb0, 0x85, 0x8d, 0xff, 0x2a, 0x3b, 0x58, 0xff, 0xd0, 0xb4, 0x96, 0xff, 0x9a, 0x30, 0x2b, 0xff, 0x12, 0x67, 0xaa, 0xff, 0x89, 0x53, 0xde, 0xff}, Stride:20, Rect:image.Rectangle{Min:image.Point{X:0, Y:0}, Max:image.Point{X:5, Y:5}}}

got: &image.RGBA{Pix:[]uint8{0x56, 0x84, 0x7a, 0xff, 0xef, 0x60, 0x9b, 0xff, 0x10, 0x8a, 0x4d, 0xff, 0xfc, 0x76, 0x5e, 0xff, 0x65, 0x5a, 0xa5, 0xff, 0xfe, 0x97, 0x99, 0xff, 0xa7, 0x83, 0x32, 0xff, 0x92, 0xae, 0xb, 0xff, 0xd6, 0x7b, 0xde, 0xff, 0xab, 0x1, 0x17, 0xff, 0x73, 0x9b, 0x3d, 0xff, 0x42, 0x8f, 0x85, 0xff, 0x48, 0xd3, 0x2d, 0xff, 0x3d, 0x54, 0x81, 0xff, 0xce, 0x6b, 0xf8, 0xff, 0x96, 0x77, 0x97, 0xff, 0xed, 0x25, 0x34, 0xff, 0x9c, 0x67, 0xdc, 0xff, 0xcd, 0xfa, 0x53, 0xff, 0xb0, 0x85, 0x8d, 0xff, 0x2a, 0x3b, 0x58, 0xff, 0xd0, 0xb4, 0x96, 0xff, 0x9a, 0x30, 0x2b, 0xff, 0x12, 0x67, 0xaa, 0xff, 0x89, 0x53, 0xde, 0xff}, Stride:20, Rect:image.Rectangle{Min:image.Point{X:0, Y:0}, Max:image.Point{X:5, Y:5}}}[39m
注意#1:您不能(不应)使用 reflect.DeepEqual() 比较图像,但是从输出中可以清楚地看到,解码后的像素是相同的。
注2:您可以将 bytes.Buffer 直接传递给 png.Decode() ,而无需围绕它创建另一个包装。它实现了 io.Reader ,其 Read()方法“提供”了先前写入其中的数据:
outImage, err := png.Decode(out)
注意#3:当您使用 math/rand 时,应使用 rand.Seed() 作为种子,否则每次运行都将获得相同的伪随机序列(并且没有不同的随机数据)。

关于image - 对其进行编码和解码后将所有零成像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66133076/

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