Image转换为byte[]

zhiheyang 2011-10-27 09:07:59
byte[] fileByte= File.ReadAllBytes("C:\1.jpg");



Image img=Image.FromFile(@"C:\1.jpg");
byte[] imageByte=ImageToByteArr(img);
private byte[] ImageToByteArr(Image img)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Position = 0;
byte[] imageBytes = new byte[ms.Length];
ms.Read(imageBytes, 0, imageBytes.Length);
return imageBytes;
}
}


这2种方法取到的byte[]数组fileByte和imageByte发现不同,比较方法如下:

if (byte1.Length != byte2.Length)
{
return false;
}
else
{
for (Int64 i = 0; i < byte1.Length; i++)
{
if (byte1[i] != byte2[i])
{
return false;
}
}
return true;
}



请问这是为啥啊?
...全文
514 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhiheyang 2011-11-07
  • 打赏
  • 举报
回复
试试结过贴的还能不能在盖楼
dsjoy 2011-10-31
  • 打赏
  • 举报
回复

public static byte[] GetImageBytes(Bitmap bmp)
{
byte[] data = new byte[bmp.Width * bmp.Height];
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height)
, ImageLockMode.Read, bmp.PixelFormat);
Marshal.Copy(bmpData.Scan0, data, 0, data.Length);
bmp.UnlockBits(bmpData);
return data;
}
sdl2005lyx 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yanghe1117 的回复:]

不知道大家都是怎么把picturebox中的image如何保存的数据库中的?
[/Quote]

给你一个实例:

Image img = Image.FromFile(@"c:\test.jpg");
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

byte[] myData = ms.ToArray();
SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=utscadadb;Integrated Security=SSPI; User Id=sa;Password=ut2001;");
SqlCommand cmd = new SqlCommand("Update Table1 Set data = (@data) where id =3", cn);
cmd.Parameters.Add("@file ", SqlDbType.VarChar).Value = "d:\\test.jpg";
cmd.Parameters.Add("@data ", SqlDbType.Image).Value = myData;

cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
大大黑眼圈 2011-10-31
  • 打赏
  • 举报
回复
上面的流打断点看其实可以读出来的 只部过没有存进二进制中 二进制有长度 但是值全部是0

我的也是用上面的方法写进二进制,可以读到数据进入流中,第二个picturebox取数据源的话取第一个流的内容也可读出来
jimh 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jzyuchen 的回复:]

问题的根本在于img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

jpeg有多种压缩格式,压缩格式不一样你得到的 byte[]自然不一样。
[/Quote]
顶,谁叫楼主自己Save图片了,这样一Save,怎么能保证原汁原味?
zhiheyang 2011-10-31
  • 打赏
  • 举报
回复
不知道大家都是怎么把picturebox中的image如何保存的数据库中的?
zhiheyang 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yuwenge 的回复:]

这事,先解释一下什么是图片文件。什么是Jpg
图片文件是图片数据在硬盘上的保存,jpg是一种保存的方式。还有bmp,png,等等。都是不同的保存方式。
他们的不同在于对图片数据的压缩和存储上,bmp是按照图片的大小,存储所有的byte。因为计算机上每一个像素点,需要一个或者多个byte来描述。所以bmp文件会很大。而jpg是对这些byte[]做了压缩。但是这种压缩是有损的,也就是说保存的图片……
[/Quote]
这样的话,如果我把本地的一个jpg文件显示在picturebox中,然后把picturebox.Image保存到数据库中,这个保存到数据库中的byte[]是与实际的jpg文件不同的?
zhiheyang 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jimh 的回复:]

引用 13 楼 jzyuchen 的回复:

问题的根本在于img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

jpeg有多种压缩格式,压缩格式不一样你得到的 byte[]自然不一样。

顶,谁叫楼主自己Save图片了,这样一Save,怎么能保证原汁原味?
[/Quote]

那要怎么转换,如果我是通过webservice获取到的照片byte[]显示在了picturebox,然后我要把这张照片保存到数据库中,如果要原汁原味,我如果不直接从picturebox.image上直接获取,岂不是还要新加一个变量保存从webservice上获取到的照片byte[]?
zhiheyang 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sdl2005lyx 的回复:]

引用 16 楼 yanghe1117 的回复:

不知道大家都是怎么把picturebox中的image如何保存的数据库中的?


给你一个实例:
C# code

Image img = Image.FromFile(@"c:\test.jpg");
MemoryStream ms = new MemoryStream();
img.Save(ms,……
[/Quote]

这种方式和我第二种把image转化为byte[]的方法一样
卧_槽 2011-10-28
  • 打赏
  • 举报
回复
这事,先解释一下什么是图片文件。什么是Jpg
图片文件是图片数据在硬盘上的保存,jpg是一种保存的方式。还有bmp,png,等等。都是不同的保存方式。
他们的不同在于对图片数据的压缩和存储上,bmp是按照图片的大小,存储所有的byte。因为计算机上每一个像素点,需要一个或者多个byte来描述。所以bmp文件会很大。而jpg是对这些byte[]做了压缩。但是这种压缩是有损的,也就是说保存的图片中的像素点,不是所有的像素点。在展示的时候,某些像素点的信息会丢失,需要通过计算得到。这样的好处是文件可以很小。所以jpg保存的时候还可以设置图片质量。质量越差,文件越小。
这就是为什么你把图片文件读出来,作为一个image对象,又保存到stream之后,会和以前不一样。因为这个过程包括了一个解压显示,和一个再次压缩保存的过程,中间又会丢失部分数据。
GDI+直接存jpg的时候,jpg图片质量默认是娶的90%。

不知道这么解释,楼主能清楚了不。
jzyuchen 2011-10-28
  • 打赏
  • 举报
回复
问题的根本在于img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

jpeg有多种压缩格式,压缩格式不一样你得到的 byte[]自然不一样。
萧炎 2011-10-28
  • 打赏
  • 举报
回复
ReadAllBytes方法是试图根据现存的字节顺序标记来自动检测文件的编码,可检测到编码格式 UTF-8 和 UTF-32(包括 big-endian 和 little-endian)。

uncle_bacon 2011-10-28
  • 打赏
  • 举报
回复
呼唤牛人
DSIOF3KIDSKTR 2011-10-28
  • 打赏
  • 举报
回复
一个是以固定增长的Capacity初始化数组,一个是实际长度
sdl2005lyx 2011-10-28
  • 打赏
  • 举报
回复
换一种办法:

Image img = Image.FromFile(@"c:\test.jpg");
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);


byte[] myData = ms.ToArray();
congplayer 2011-10-28
  • 打赏
  • 举报
回复
FileStream fs = File.OpenRead(@"E:\cong file\JXMobile\JXMobile.Site\images\sptp\n_13589340702212.jpg");
byte[] img = new byte[fs.Length];
fs.Read(img, 0, img.Length);
fs.Close();
zhiheyang 2011-10-28
  • 打赏
  • 举报
回复
没人回答了吗?呼唤牛人
zhiheyang 2011-10-27
  • 打赏
  • 举报
回复
能不能详细点,或者说怎么能从Image获取实际文件byte[]?
henlyming 2011-10-27
  • 打赏
  • 举报
回复
学习了
cjh200102 2011-10-27
  • 打赏
  • 举报
回复
楼上不错。
加载更多回复(2)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧