- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在编写测试的过程中,我遇到了一个奇怪的行为,当给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()
比较图像,但是从输出中可以清楚地看到,解码后的像素是相同的。
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/
我正在使用 PIL 在 Python 中进行一些图像处理,我需要从一系列图像中提取亮度层,并使用 numpy 对其进行一些处理,然后将编辑后的亮度层放回图像中并保存.问题是,我似乎无法以 YCbCr
问题是从内存中加载 jpeg 编码的图像。 我从套接字收到一个字符串: jpgdata = self.rfile.read(sz) 我知道这是 jpeg 编码的图像。 我需要解码它。最愚蠢的解决方案是
我目前正在检查一个项目的 django。我也在看 django-cms。 Django-cms 需要 python-imaging。我找不到在当前版本的 OSX 上安装它的简单方法,事实上,在我什至开
我在 Visual Studio Code 中开发 F#,当我尝试使用 FAKE 编译我的代码时,出现上述错误: warning MSB3245: Could not resolve this ref
我正在使用 Apache Commons Imaging library (Java 8,你可以找到我的代码 here )并且我遇到了一些标签问题: 如果我打开例如的图像信息this Win 10 的
尝试使用 PIL创建一个透明的 gif。到目前为止,我有这个: from PIL import Image img = Image.new('RGBA', (100, 100), (2
我在使用 leadtools imaging api 时在 asp.net 中遇到一个奇怪的错误。这是堆栈跟踪。 System.AccessViolationException: Attempted
我试图将最初的列表“ThetaVect1”转换为形状为(16,)的np.ndarray,将其更改为(4,4)数组,然后使用np.ndarray。 newaxis 来获得第三个维度,我试图将其设置为 3
对于 3d 成像软件,我正在编码: 我需要定义一个椭球 E,它可以在空间中具有任何半径、中心和旋转 用户界面允许用户控制 3 个椭圆,它们是椭圆的“切片”(图像中的红色、绿色、蓝色),并且(根据定义)
我是一名优秀的程序员,十分优秀!