二进制图片存取读入.
### 二进制图片存取读入的核心技术与实践 #### 一、二进制图片存取概述 在计算机编程领域,尤其是Web开发或者桌面应用开发中,经常会遇到需要处理图像的情况。对于图像数据的存储,最常见的做法是将其转换为二进制格式进行存储和读取。这种方式可以有效地减少文件大小,并且能够方便地集成到数据库系统中。本文将通过一个具体的示例来讲解如何在.NET框架下实现二进制图片的存取操作。 #### 二、二进制图片的存储过程 在.NET框架中,我们可以利用`FileStream`类和`SqlCommand`对象来实现这一功能。下面是对给定代码片段中的关键步骤进行详细解析: 1. **打开文件流**:我们需要创建一个`FileStream`对象,用于读取本地磁盘上的图片文件。 ```csharp FileStream fs = new FileStream("ż.jpg", FileMode.Open, FileAccess.Read); ``` 这里,`"ż.jpg"`是需要读取的图片文件路径;`FileMode.Open`表示以只读模式打开文件;`FileAccess.Read`则表示只读取数据。 2. **读取图片为二进制数组**:接着,将文件内容读取到一个字节数组中。 ```csharp byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, (int)fs.Length); ``` 这里,`fs.Length`获取的是文件的总长度,`fs.Read()`方法则用于读取指定长度的数据到字节数组中。 3. **构建SQL命令并执行**:接下来,需要准备SQL语句,以便将图片数据插入数据库。 ```csharp string sql = "insert into TestFiles(MyFileName, FileType, MyFile) values (@FN, @FT, @MF)"; SqlCommand com = new SqlCommand(sql, this.sqlCon); SqlParameter FN = new SqlParameter("@FN", SqlDbType.VarChar); FN.Value = "ż"; com.Parameters.Add(FN); SqlParameter FT = new SqlParameter("@FT", SqlDbType.VarChar); FT.Value = "JPG"; com.Parameters.Add(FT); SqlParameter MF = new SqlParameter("@MF", SqlDbType.Image); MF.Value = bytes; com.Parameters.Add(MF); com.CommandType = CommandType.Text; sqlCon.ConnectionString = this.conStr; ``` 在这段代码中,我们定义了一个SQL插入语句,用于将图片的文件名、类型以及二进制数据插入到名为`TestFiles`的表中。`SqlCommand`对象用于执行SQL命令,而`SqlParameter`对象则是用来传递参数的。 4. **执行SQL命令**:打开数据库连接,并执行SQL命令。 ```csharp try { sqlCon.Open(); com.ExecuteNonQuery(); sqlCon.Close(); MessageBox.Show("ɹ"); } catch (Exception ex) { throw ex; } finally { sqlCon.Close(); } ``` 上述代码中,我们尝试打开数据库连接,并执行插入操作。如果成功,则会显示一个消息框;如果出现异常,则会抛出异常。 #### 三、二进制图片的读取过程 接下来,我们来看一下如何从数据库中读取二进制图片数据,并将其保存为本地文件。 1. **构建查询命令**:构建一个SQL查询命令,用于从数据库中读取图片数据。 ```csharp string sql = "select MyFile from TestFiles where id = 1"; SqlCommand readComm = new SqlCommand(sql, this.sqlCon); ``` 2. **执行查询并读取数据**:执行查询命令,并将结果写入到新的文件中。 ```csharp try { sqlCon.Open(); SqlDataReader dr = readComm.ExecuteReader(); while (dr.Read()) { FileStream fs = new FileStream("TakeOut.jpg", FileMode.OpenOrCreate, FileAccess.Write); BinaryWriter bw = new BinaryWriter(fs); int bufferSize = 100; byte[] outByte = new byte[bufferSize]; long retval; long startIndex = 0; // 读取数据 retval = dr.GetBytes(0, startIndex, outByte, 0, bufferSize); while (retval == bufferSize) { bw.Write(outByte); bw.Flush(); startIndex += bufferSize; retval = dr.GetBytes(0, startIndex, outByte, 0, bufferSize); } // 写入剩余的数据 bw.Write(outByte, 0, (int)retval - 1); bw.Flush(); // 关闭输出文件 bw.Close(); fs.Close(); Image im = Image.FromFile("TakeOut.jpg"); this.pictureBox1.Image = im; } sqlCon.Close(); } catch (Exception ex) { throw ex; } finally { sqlCon.Close(); bw.Close(); fs.Close(); } ``` 在这段代码中,我们首先定义了`FileStream`和`BinaryWriter`对象,用于创建一个新的文件,并向其中写入从数据库读取到的图片数据。这里使用了`SqlDataReader`对象来读取数据,并通过循环不断地将数据写入到新文件中,直到所有数据都写入完毕为止。 通过上述步骤,我们不仅能够将图片以二进制的形式存储到数据库中,而且还能够从数据库中读取这些数据,并恢复成原来的图片文件。这对于开发需要处理大量图像的应用程序来说是非常实用的技术。