我希望能够从Byte []转换为Image,反之亦然。
我有here中的这两种方法:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
他们似乎工作,但如果我这样做:
byte[] pic = GetImageFromDb();
bool result = pic == imageToByteArray(byteArrayToImage(pic));
我得到result = false
!
有任何方法可以纠正这种方法或某些不同的功能来实现我的目标吗?
谢谢!
答案 0 :(得分:15)
如果没有覆盖,使用==
将比较对象引用。
由于这些是两个不同的 byte[]
个对象,因此引用不同。
您需要逐项比较byte[]
个对象,以确认它们是相同的。在这种情况下,您可以使用SequenceEquals
。
答案 1 :(得分:2)
==
表示您对内存中的同一对象有引用。
This展示了如何以几种不同的方式比较字节数组。
答案 2 :(得分:2)
我最近需要编写一个需要将fileBytes保存为图像的图像裁剪器。这就是我做的。希望这对你有帮助。
public Image byteArrayToImage(byte[] fileBytes)
{
using (MemoryStream fileStream = new MemoryStream(fileBytes))
{
return Image.FromStream( fileStream );
}
}
显然我的裁剪/保存代码扩展了这一点。但我能够从文件字节返回一个Image对象。
答案 3 :(得分:1)
重新编码图像时,生成的文件(或字节数组)可能(稍微?)与原始版本不同。特别是如果你从数据库中检索的是一个jpeg文件!
因此,即使您比较数组中的字节(而不是引用),您也可以获得差异。
修改强>
当您将一个byte [](包含GIF编码图像)读入BitMap
时,这些字节将被解压缩为每个像素4个(ARGB)字节。将BitMap保存到(新)gif文件(或byte [])时,新编码的文件可能不同(例如,颜色的存储顺序)。所以不能保证新文件(或byte [])与旧文件相同,尽管图像本身没有改变。