博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO流操作-图片操作(二)
阅读量:5991 次
发布时间:2019-06-20

本文共 3015 字,大约阅读时间需要 10 分钟。

一:Stream和Byte的含义

     

Stream:流,一般指文件流,内存流,可读的流和可写的流等,是一种数据转换的格式,流在计算机里可以表示为流输入或输出的一个连续的字节序列,它在使用完后,需要把资源释放。Byte[]:字节数组,字节是通过网络传输信息的单位。在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。当一个字符通过网络从一端发到别一端时,会将它转换成字节数组,需要再发送。文件上传时的Stream和byte[],有地我们需要进行转换,这里总结了两个方法
public byte[] StreamToBytes(Stream stream){    byte[] bytes = new byte[stream.Length];    stream.Read(bytes, 0, bytes.Length);    stream.Seek(0, SeekOrigin.Begin);    return bytes;}  public Stream BytesToStream(byte[] bytes){    Stream stream = new MemoryStream(bytes);    return stream;}

第一句话 byte[] bytes = new byte[stream.Length]; 主要就是声明一个数组

第二句话  Stream.Read 

public abstract int Read(byte[] buffer, int offset, int count)参数:buffer: 字节数组。此方法返回时,该缓冲区包含指定的字符数组,该数组的 offset 和 (offset + count -1) 之间的值由从当前源中读取的字节替换。offset: buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据【告诉我们从流中哪个位置(偏移量)开始读取】。count: 要从当前流中最多读取的字节数【就是读取多少字节数】。

  返回值

  读入缓冲区中的总字节数。如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。

 

  备注

   此方法的实现从当前流中读取最多的 count 个字节,并将它们存储在从 offset 开始的 buffer 中。流中的当前位置提升已读取的字节数;但是,如果出现异常,流中的当前位置保持不变。实现返回已读取的字节数。仅当位置当前位于流的末    尾时,返回值才为零。如果没有任何可用的数据,该实现将一直阻塞到至少有一个字节的数据可读为止。仅当流中不再有其他的数据,而且也不再需要更多的数据(如已关闭的套接字或文件尾)时,Read 才返回 0。即使尚未到达流的末尾,实现    仍可以随意返回少于所请求的字节。

 

第三句话 abstract long Seek(long offset, SeekOrigin origin)

1.SeekOrigin这个枚举的解释    Begin :指定流的开头    Current:指定流的当前位置    Eed:指定流的结尾 2.Offset 如果 offset 为负,则要求新位置位于 origin 指定的位置之前,其间隔相差 offset 指定的字节数。 如果 offset 为零 (0),则要求新位置位于由 origin 指定的位置处。

  如果 offset 为正,则要求新位置位于 origin 指定的位置之后,其间隔相差 offset 指定的字节数。

  Stream. Seek(-3,Origin.End); 表示在流末端往前数第3个位置

  Stream. Seek(0,Origin.Begin); 表示在流的开头位置

  Stream. Seek(3,Orig`in.Current); 表示在流的当前位置往后数第三个位置

 

 

一,选取一张图片       var open = new OpenFileDialog();            open.Filter = "图片|*.jpg";            open.ShowDialog();            var filepath = open.FileName;(1)将图片转成流,流的方式生成图片//第一中方法,先转成流            FileStream file=new FileStream(filepath,FileMode.Open);            //创建一个file.length大小的数组控件            byte[] bt= new byte[file.Length];             file.Read(bt, 0, bt.Length);             file.Close();             //创建内存流            MemoryStream mstream=new MemoryStream(bt);            System.Drawing.Image image = System.Drawing.Image.FromStream(mstream);            var imgPath = "../../IMG/2015.png";            image.Save(imgPath, ImageFormat.Png);(二)直接读取  System.Drawing.Image image = System.Drawing.Image.FromFile(filepath);            var imgPath = "../../IMG/2015.png";(3)转成位图进行存储    Bitmap bi=new Bitmap(filepath);            var imgPath = "../../IMG/2015.png";            bi.Save(imgPath);(4)先转成流,在使用位图进行读取 FileStream file = new FileStream(filepath, FileMode.Open);            //创建一个file.length大小的数组控件            byte[] bt = new byte[file.Length];            file.Read(bt, 0, bt.Length);            file.Close();            //把流转换成内存流            MemoryStream ms=new MemoryStream(bt);            Bitmap bi = new Bitmap(ms);            var imgPath = "../../IMG/2016.png";            bi.Save(imgPath,ImageFormat.Png);

 

主要文章来源  & 

转载于:https://www.cnblogs.com/xiaoyaodijun/p/4516745.html

你可能感兴趣的文章
Java基础-包(package)的声明与访问
查看>>
vue 开发系列(七) 路由配置
查看>>
sklearn机器学习-泰坦尼克号
查看>>
java多线程有哪些实际的应用场景?
查看>>
mybatis源码解读(二)——构建Configuration对象
查看>>
Cordova页面加载外网图片失败,Refused to load the image
查看>>
在storm中运行jar产生模拟数据的时候,遇见的问题
查看>>
asp.net mvc中动作方法的重定向
查看>>
解决svn中文乱码的问题
查看>>
记录一下 ps命令找出线程占用cpu情况
查看>>
Android Studio preview 不显示,程序运行正常
查看>>
漫画解读“跨视图粒度计算”,了解有数分析利器
查看>>
java List<String>的初始化
查看>>
聊聊 API Gateway 和 Netflix Zuul
查看>>
694. Number of Distinct Islands
查看>>
Qt中对QDomDocument和QDomnode的理解
查看>>
小程序实践(十一):showModal的使用
查看>>
汉诺塔-递归实现
查看>>
linux下保护视力、定时强制锁定软件: Workrave
查看>>
基于Token认证的多点登录和WebApi保护
查看>>