我在Microsoft SQL Server中有一个varbinary(max)字段,其中包含一个图像。
运行“从表中选择图像”时,得到的结果看起来像是“ 0x07FD30 ....”
使用go检索数据时,我得到的十六进制字符串存储为[] byte:
type Person struct {
PersonID string
Image []byte
}
我连接到数据库并执行以下操作:
rows.Scan(&person.PersonID, &person.Image)
然后将结果打印为十六进制,相同:
fmt.Printf("%#x", p.Image)
结果:
0x07fd30...
我的问题是,如何将其转换为图像?
我尝试将原始字节写入文件:
ioutil.WriteFile("./tempfile.png", p.Image, 0644)
我尝试使用图片库对其进行解码,只是出现了一种不明类型的错误:
image.Decode(bytes.NewReader(p.Image))
还尝试了png.Encode
。
任何朝着正确方向的想法或指示都将受到赞赏。
非常感谢。
答案 0 :(得分:1)
Darren是正确的,因为总是通过AX将前7个字节添加到图像文件中,即07FD3097F90000
。
不幸的是,似乎AX还在二进制文件的末尾添加了其他信息。我还没有弄清楚它的确切模式,但是通常情况下,如果上传的图像相对较小,并且其高度小于宽度,则AX只会在末尾添加FF
,否则会对它进行大量更改文件。
在您的情况下,如果您只对存储在SQL Server中的一个特定映像感兴趣,请查看二进制文件并查看其是否以FF
结尾。如果是,请剥离多余的字节,然后将其转换为base64以显示它。
答案 1 :(得分:0)
使用ioutil.WriteFile("./tempfile.png", p.Image, 0644)
将原始字节写入文件似乎是正确的过程。但是,无论出于何种原因,Microsoft Dynamics AX 2012似乎都使用其BinData类将其保存到数据库时在文件的开头添加了额外的7个字节。因此,使用ioutil.WriteFile(s, p.Image[7:], 0644)
是可行的。我想了解这7个字节是什么以及它们的用途,但是那是另一天的事情。谢谢。