下面是“c#读取图像保存到数据库中(数据库保存图片)”的完整攻略:
1. 准备工作
在开始正式的代码编写之前,需要先做一些准备工作:
- 创建一个数据库,并在其中新建一张表以保存图片数据。该表至少应该包含三个字段:
id
,name
和image_data
。 - 在代码中添加相关的引用,如:
System.Drawing
、System.IO
、System.Data.SqlClient
。
2. 读取图片并转换成字节数组
图片读取可以使用System.Drawing.Image
类的FromStream
方法,将图片转换成字节数组使用System.IO.MemoryStream
类的ToArray
方法。示例代码如下:
using System.Drawing;
using System.IO;
// 读取图片并转换成字节数组
public byte[] ReadImage(string filePath)
{
using (var ms = new MemoryStream())
{
using (var img = Image.FromFile(filePath))
{
img.Save(ms, img.RawFormat);
return ms.ToArray();
}
}
}
ReadImage
方法接收一个文件路径作为参数,返回一个字节数组表示该图片的数据。
3. 将图片数据保存到数据库中
将图片数据保存到数据库中可以使用System.Data.SqlClient.SqlCommand
类的ExecuteNonQuery
方法。需要注意的是,将图片数据作为二进制数据保存到数据库中时,要使用SqlParameter
类的SqlDbType.VarBinary
类型。示例代码如下:
using System.Data.SqlClient;
// 将图片数据保存到数据库中
public void SaveImageToDatabase(string connectionString, string imageName, byte[] imageData)
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO image_table (name, image_data) VALUES (@name, @image_data)";
cmd.Parameters.AddWithValue("@name", imageName);
cmd.Parameters.AddWithValue("@image_data", SqlDbType.VarBinary).Value = imageData;
cmd.ExecuteNonQuery();
}
}
}
SaveImageToDatabase
方法接收一个数据库连接字符串、图片的名称、以及表示图片数据的字节数组作为参数。在方法实现中,首先打开数据库连接,然后创建一个SqlCommand
对象,并使用参数化查询插入一条记录到数据库中,最后关闭数据库连接。
4. 从数据库中读取图片数据并转换成Image对象
从数据库中读取图片数据可以使用System.Data.SqlClient.SqlDataReader
类,并将其转换成System.Drawing.Image
对象。读取图片数据时,需要使用SqlDataReader
类的GetBytes
方法读取二进制数据,并使用System.IO.MemoryStream
类的Write
方法将其转换成字节数组,最后使用Image.FromStream
方法将字节数组转换成Image
对象。示例代码如下:
using System.Data.SqlClient;
// 从数据库中读取图片数据并转换成Image对象
public Image ReadImageFromDatabase(string connectionString, int imageId)
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT name, image_data FROM image_table WHERE id = @id";
cmd.Parameters.AddWithValue("@id", imageId);
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
var name = reader.GetString(reader.GetOrdinal("name"));
var imageData = new byte[reader.GetBytes(reader.GetOrdinal("image_data"), 0, null, 0, int.MaxValue)];
reader.GetBytes(reader.GetOrdinal("image_data"), 0, imageData, 0, imageData.Length);
return Image.FromStream(new MemoryStream(imageData));
}
}
}
}
return null;
}
ReadImageFromDatabase
方法接收一个数据库连接字符串和图片的id作为参数。在方法实现中,首先打开数据库连接,然后创建一个SqlCommand
对象,并执行查询语句。在得到查询结果后,将图片数据转换成字节数组,并最终转换成Image
对象。
5. 示例代码
下面是使用以上两个方法实现读取图片并保存到数据库中、从数据库中读取图片并显示的示例代码:
using System;
using System.Drawing;
using System.IO;
public class ImageDatabase
{
private string connectionString;
public ImageDatabase(string connectionString)
{
this.connectionString = connectionString;
}
// 读取图片并保存到数据库中
public void SaveImage(string filePath)
{
var imageName = Path.GetFileName(filePath);
var imageData = ReadImage(filePath);
SaveImageToDatabase(connectionString, imageName, imageData);
}
// 显示指定id的图片
public void ShowImage(int imageId)
{
using (var img = ReadImageFromDatabase(connectionString, imageId))
{
if (img != null)
{
img.Show();
}
else
{
Console.WriteLine("Image not found.");
}
}
}
// 读取图片并转换成字节数组
private byte[] ReadImage(string filePath)
{
using (var ms = new MemoryStream())
{
using (var img = Image.FromFile(filePath))
{
img.Save(ms, img.RawFormat);
return ms.ToArray();
}
}
}
// 将图片数据保存到数据库中
private void SaveImageToDatabase(string connectionString, string imageName, byte[] imageData)
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO image_table (name, image_data) VALUES (@name, @image_data)";
cmd.Parameters.AddWithValue("@name", imageName);
cmd.Parameters.AddWithValue("@image_data", SqlDbType.VarBinary).Value = imageData;
cmd.ExecuteNonQuery();
}
}
}
// 从数据库中读取图片数据并转换成Image对象
private Image ReadImageFromDatabase(string connectionString, int imageId)
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT name, image_data FROM image_table WHERE id = @id";
cmd.Parameters.AddWithValue("@id", imageId);
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
var name = reader.GetString(reader.GetOrdinal("name"));
var imageData = new byte[reader.GetBytes(reader.GetOrdinal("image_data"), 0, null, 0, int.MaxValue)];
reader.GetBytes(reader.GetOrdinal("image_data"), 0, imageData, 0, imageData.Length);
return Image.FromStream(new MemoryStream(imageData));
}
}
}
}
return null;
}
}
使用该类保存图片和显示图片的示例代码如下:
using System;
class Program
{
static void Main(string[] args)
{
var connectionString = "Data Source=(local);Initial Catalog=Test;Integrated Security=True";
var db = new ImageDatabase(connectionString);
// 保存图片
db.SaveImage(@"C:\Pictures\test.jpg");
// 显示图片
db.ShowImage(1);
Console.ReadKey();
}
}
以上就是完整的“c#读取图像保存到数据库中(数据库保存图片)”攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#读取图像保存到数据库中(数据库保存图片) - Python技术站