通过MemoryStream把Image读取到byte数组中,在不同的主机上得到的结果不一样

问题描述

在项目中遇到这么个问题,需要把Image转换成Hex的字符串,但是发现在不同的计算机上得到的结果会不一样;不知道什么原因publicstringImageToString(Imageimage){if(image==null){returnnull;}stringdata="";byte[]bytedata=null;using(MemoryStreamoMemoryStream=newMemoryStream()){//建立副本using(BitmapoBitmap=newBitmap(image)){oBitmap.Save(oMemoryStream,System.Drawing.Imaging.ImageFormat.Jpeg);oMemoryStream.Position=0;oMemoryStream.Seek(0,SeekOrigin.Begin);bytedata=newbyte[oMemoryStream.Length];oMemoryStream.Read(bytedata,0,Convert.ToInt32(oMemoryStream.Length));oMemoryStream.Flush();}}//把bytedata的数据保存到文件stringfilename="c:\"+textBox1.Text+".txt";if(!File.Exists(filename)){File.Create(filename).Close();}StringBuilderbuilder=newStringBuilder();for(inti=0;i<bytedata.Length;i++){builder.Append(bytedata[i]);}File.WriteAllText(filename,builder.ToString());//在不同的计算机上,这里打印出的结果就不一样了//byte转成HexStrdata=byteToHexStr(bytedata);intlen=data.Length;returndata;}

解决方案

解决方案二:
图片文件都有文件头信息,头信息里常常会带有作成日期,所有人之类的信息,所以每次生成都可能会不同。
解决方案三:
引用1楼xdashewan的回复:

图片文件都有文件头信息,头信息里常常会带有作成日期,所有人之类的信息,所以每次生成都可能会不同。

怎么保证一样呢?我是用某个图片去做检索用,如果不一样的话,检索出来的结果也会有细微不同
解决方案四:
考虑64位和32位的问题,试试生成x86
解决方案五:
引用3楼rocmemory的回复:

考虑64位和32位的问题,试试生成x86

都是32位的
解决方案六:
比较图片,用该图片的md5或哈希码进行比较,例如我们在网上下载一个文件,有这两个编码的值
解决方案七:
楼主的代码中是将图片复制后再存储的,这个原因不是明摆着的么,存为JPEG就会带一些其他数据.如果原始的图片已经是JPEG格式的话就不要再复制了,可以直接这样用:image.Save(oMemoryStream,image.RawFormat);
解决方案八:
位于网络位置的同一张图片,我在不同的计算机上加载,结果就是不一样,通过比较.NET版本后发现,不同的.NET版本出来的结果不一样,而相同的.NET版本下,产生的结果是一样的

时间: 2024-09-20 18:49:48

通过MemoryStream把Image读取到byte数组中,在不同的主机上得到的结果不一样的相关文章

从byte数组中取值

问题描述 从这个byte[]packet={48,0,1,64,48,57,69,48,48,70,56,57,69}中取packet[2]和packet[3]的值,并把它值赋值到新的bytemy[]数组中,条件是新的byte数组中的值是packet[3]z在前,packet[2]在后,赋值之后是byte[]my={64,1}.请高手解答,谢谢了 解决方案 解决方案二:byte[]newarray={0,0};Array.ConstrainedCopy(packet,2,newarray,0,2

c#-怎么将excel中数据用C#读取并存在一个数组中?

问题描述 怎么将excel中数据用C#读取并存在一个数组中? 如图,excel中数据怎么放入c#的数组中,如a[0,0]=22200,a[1,0]=21500 解决方案 一般读取EXCEL都是到数据表中,直接使用数据表数据即可,如果特定应用使用到二维数组的话,直接把数据表行相当于一个一维数组ADD到二维数据即可 如:listaa=new list;aa.add(数据表.Tables[0].Rows[0].ToArray());大概是这样意思了,代码随便写的,自己去写好. 解决方案二: try i

请教:数组是引用类型,所以数组存在堆上,那数组中的元素存在栈上吗?

问题描述 请教:数组是引用类型,所以数组存在堆上,那数组中的元素存在栈上吗? 解决方案 解决方案二:数组中的元素可以通过地址找到,应该是在堆上解决方案三:当然在堆上,类是引用类型,类实例的某个字段是值类型,类实例的某个字段还是在堆上,数组的情况也一样解决方案四:建议看看装箱,拆箱解决方案五:数组里的对象没有装箱,拆箱问题.就是在堆上分配内存.c,c++的数组可以分配在栈上效率比c#好

请教如何快速读取像素到数组中。多谢了~

问题描述 能同时适用不同的格式图片 解决方案 解决方案二:如果目标格式可以转为Bitmap,就可以用GetPixel方法读取颜色喜好,但像你说的要优化读取速度并适应所有格式,没有现成的库,你可以研究一下,弄出来可以卖钱解决方案三:引用1楼rocmemory的回复: 如果目标格式可以转为Bitmap,就可以用GetPixel方法读取颜色喜好,但像你说的要优化读取速度并适应所有格式,没有现成的库,你可以研究一下,弄出来可以卖钱 +1解决方案四:引用1楼rocmemory的回复: 如果目标格式可以转为

java-android读取设备返回byte数组解析问题

问题描述 android读取设备返回byte数组解析问题 android通过socket读取到一串数据,存在Byte数组中的值为 67 82 80 0 -52 -52 -52 -52 -52 -52,这个值如何转为java 字符串,我用了很多方法都有乱码,求了解的大神帮忙解惑 解决方案 乱码可以转码 百度java字符串解码 解决方案二: 通信双方统一下数据的编码方式,统一使用utf-8或者其他编码 解决方案三: System.out.println(new String(数组, "gbk&quo

读取Java文件到byte数组的三种方法(总结)_java

读取Java文件到byte数组的三种方法(总结) package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Rando

C# byte数组与Image的相互转换

功能需求: 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库. 2.把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示. 3.从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上. 这里的Image是System.Drawing.Image. //Get an image from file Image image = Image.FromFile("D:\\test.jpg"); Bitmap bitmap = n

将Byte数组转化为String

数组 问题 FCL得很多方法的返回值都是包含字符的Byte数组而不是返回一个String,这样的方法包含在如下的类中: · System.Net.Sockets.Socket.Receive · System.Net.Sockets.Socket.ReceiveFrom · System.Net.Sockets.Socket.BeginReceive · System.Net.Sockets.Socket.BeginReceiveFrom · System.Net.Sockets.Network

rgb转换byte数组-rgb转byte数组应该怎么处理

问题描述 rgb转byte数组应该怎么处理 我在看YUV420SP转RGB的时候有如下一段java代码if (r < 0) r = 0; else if (r > 262143) r = 262143; if (g < 0) g = 0; else if (g > 262143) g = 262143; if (b < 0) b = 0; else if (b > 262143) b = 262143; rgbBuf[yp * 3] = (byte)(r >>