3-7 寫二進制文件案例學習

3-4-2   寫二進制文件案例學習

u 本案例您將學習到:
n 圖片文件二進制流的讀取並顯示在圖像控件之中;
n 如何將圖像控件圖像讀取到內存流,並另外存儲;
n saveFileDialog 控件在另存文件中的做用。

1. 案例學習:寫二進制文件案例——圖片的存儲與複製

u 實驗步驟(1):
由圖 3-10 所示,從工具箱之中拖拽 MainMenu 控件、 SaveFileDialog 控件、 GroupBox 控件、 PictureBox 控件各一個到 Form 窗體上; Form 窗體的 text 屬性設置爲「圖片處理器」; GroupBox 控件的 text 屬性設置爲「圖片顯示區」; PictureBox 控件的 sizemode 屬性設置爲 zoom MainMenu 控件添加菜單項及子項如表 3 15 所示:
3-15 圖片處理器菜單控件的菜單項及子項設置
菜單項
子項
其餘屬性
圖片(&P
打開圖片(&O
快捷鍵等其餘屬性根據本身設計定(下同)
複製圖片(&C
 
關閉(&Q
 
 
3-10  圖片處理器界面圖
u 實驗步驟(2):
用鼠標雙擊主界面上菜單控件的全部菜單項,進入 .cs 文件編輯狀態準備進行開發。代碼加下:
///======================================代碼編輯===========================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace FileOptionApplication
{
    public partial class Form12 : Form
    {
        public Form12()
        {
            InitializeComponent();
        }
        /// <summary>
        /*******************************************************
        **方 法  名:GetFileBytes
        **輸 入參數:Filename:文件名稱;
        **輸 出參數:比特流類型
        **返 回  值:byte[]二進制流
        **創 建  人:錢哨
        **創 建日期: 09-7-9
        **描     述:將讀取的文件轉化成爲二進制流。
        *******************************************************/
        /// <summary>
        /// </summary>
        /// <param name="Filename">打開的圖片具體路徑及文件名稱</param>
        /// <returns>比特流類型</returns>
        public byte[] GetFileBytes(string Filename)
        {
            if (Filename == "")
                return null;
            try
            {
                FileStream fileStream = new FileStream(Filename, FileMode.Open, FileAccess.Read);
                BinaryReader binaryReader = new BinaryReader(fileStream);
                byte[] fileBytes = binaryReader.ReadBytes((int)fileStream.Length);
                binaryReader.Close();
                fileStream.Close();
                return fileBytes;
            }
            catch
            {
                return null;
            }
        }
        /*******************************************************
        **方 法  名:WriteFileBytes
        **輸 入參數:TargetFilename:目標文件名稱;
        **輸 出參數:布爾類型:是否寫成功
        **返 回  值:byte[]二進制流
        **創 建  人:錢哨
        **創 建日期: 09-7-9
        **描     述:將讀取的文件轉化成爲二進制流。       
        *******************************************************/
        /// </summary>
        /// <param name="TargetFilename">目標文件</param>
        /// <param name="fileBytes">文件比特流</param>
        /// <returns>布爾類型:是否寫成功</returns>
        public bool WriteFileBytes(string TargetFilename, byte[] fileBytes)
        {
            bool k = true;
            if (TargetFilename != "" && fileBytes.Length != 0)
            {
                try
                {
   FileStream fileStream = new FileStream(TargetFilename, FileMode.OpenOrCreate, FileAccess.Write);
                    BinaryWriter binaryWriter = new BinaryWriter(fileStream);
                    binaryWriter.Write(fileBytes);
                    binaryWriter.Flush();
                    binaryWriter.Close();
                    fileStream.Close();
                }
                catch
                {
                    k = false;
                }
            }
            else
            {
                k = false;
            }
            return k;
        }
        /// <summary>
        /// 菜單:打開圖片
        /// </summary>
        private void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog openfile = new OpenFileDialog();
                openfile.Filter = "jpg類型圖片(*.jpg)|*.jpg|BMP類型圖片(*.bmp)|*.bmp";
                if (openfile.ShowDialog() == DialogResult.OK)
                {
                    byte[] picbinary = GetFileBytes(openfile.FileName);
                    //第一步:打開圖片文件,得到比特流
                    MemoryStream mempicstream = new MemoryStream(picbinary);
                   //第二步:將比特流還存在內存工做流中。
                    pictureBox1.Image = Image.FromStream(mempicstream);
                   //第三步:加載內存流到圖片控件
                    mempicstream.Dispose();
                    mempicstream.Close();
                }
            }
            catch (Exception m)
            {
                MessageBox.Show("讀取圖片出錯,可能的問題是:"+Convert.ToString(m) ,"錯誤提示");
            }
        }
        /// <summary>
        /// 將打開的圖片進行復制
        /// </summary>
        private void toolStripMenuItem4_Click(object sender, EventArgs e)
        {
            try
            {
                if (pictureBox1.Image == null)
                {
                    MessageBox.Show("禁止圖片爲空時候另存信息。", "錯誤提示");
                }
                else
                {
                    saveFileDialog1.Filter = "jpg類型圖片(*.jpg)|*.jpg";
                    DialogResult result = saveFileDialog1.ShowDialog();
                    if (result == DialogResult.OK)
                    {
                        MemoryStream ms=new MemoryStream();
                        Bitmap bm = new Bitmap(pictureBox1.Image);
                        bm.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        byte[] bytes = ms.ToArray();
                        WriteFileBytes(saveFileDialog1.FileName, bytes);
                        MessageBox.Show("另存圖片成功", "提示");
                        ms.Dispose();
                        ms.Close();
                        bm.Dispose();
                    }
                }
            }
            catch (Exception m)
            {
               MessageBox.Show("讀取圖片出錯,可能的問題是:" + Convert.ToString(m), "錯誤提示");
            }
        }
    }
}
u 實驗步驟(3):
調試、運行程序,獲得效果如圖 3 11 所示:
3-11  圖片處理器效果圖
相關文章
相關標籤/搜索