IO流操作-图片操作(二)
一: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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的IO流操作-图片操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Mybatis的Generator可
- 下一篇: SQL Server中的锁的简单学习