c#读取图像保存到数据库中(数据库保存图片)

下面是“c#读取图像保存到数据库中(数据库保存图片)”的完整攻略:

1. 准备工作

在开始正式的代码编写之前,需要先做一些准备工作:

  • 创建一个数据库,并在其中新建一张表以保存图片数据。该表至少应该包含三个字段:idnameimage_data
  • 在代码中添加相关的引用,如:System.DrawingSystem.IOSystem.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技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • 手把手带你定制.NET 6.0的Middleware中间件

    以下是关于“手把手带你定制.NET6.0的Middleware中间件”的完整攻略: 1. 什是Middleware中间件? Middleware中间件是ASP.NET Core用程序中的一种组件,它可以处理HTTP请求和响应。Middleware中间件可以在请求到达控制之前或响应返回客户之前执行一些操作,例如身份验证、日志记录、缓存等。 2. 创建Middl…

    C# 2023年5月12日
    00
  • C#中的timer与线程使用

    C#中的timer和线程是常用的多线程编程方式,可以实现定时任务、异步操作等。下面是完整攻略: Timer 1. Timer的使用方法 Timer是一个C#中轻量级的计时器。使用时需要先创建一个Timer对象,传入一个TimerCallback委托作为回调函数,在指定时间间隔后,每次调用回调函数。常用的构造函数有: public Timer(TimerCal…

    C# 2023年6月1日
    00
  • C# 从Excel读取数据向SQL server写入

    了解如何从Excel读取数据并将其写入SQL Server是一个非常有用的技能。以下是实现此目标的完整攻略: 第一步:引入所需的库 在C#中读取和写入Excel需要使用外部库。我们需要下载并添加以下NuGet包: Microsoft.Office.Interop.Excel:允许操作Excel文件。 Microsoft.ACE.OLEDB.12.0:允许使用…

    C# 2023年5月31日
    00
  • C#实现控制电脑注销,关机和重启

    以下是C#实现控制电脑注销、关机和重启的完整攻略: 1. 获取系统权限 为了能够控制电脑的操作,首先需要获取系统管理员权限。 可以使用以下代码获取管理员权限: ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.Verb = "runas"; startInfo.F…

    C# 2023年5月14日
    00
  • C#四舍五入用法实例

    C#四舍五入用法实例攻略 本文将详细讲解C#中四舍五入的使用方法及应用场景。 四舍五入的用途 在实际开发中,我们需要处理浮点数,但是由于计算机的机器精度限制,运算中可能会产生精度误差。因此需要对浮点数进行四舍五入运算,以保证结果的精度。 Math.Round的用法 在C#中,我们可以使用Math.Round方法进行四舍五入运算。其语法如下: public s…

    C# 2023年6月7日
    00
  • 如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    当我们使用Spring Boot 2.x版本时,发现Velocity模板不被支持,我们需要重新配置才能使其正常工作。下面是一些解决方法: 1. 添加Velocity的依赖 在pom.xml文件中添加如下代码,引入Velocity的依赖 <dependency> <groupId>org.apache.velocity</grou…

    C# 2023年5月31日
    00
  • C#自定义特性(Attribute)详解

    我来详细讲解一下“C#自定义特性(Attribute)详解”的完整攻略。 什么是C#自定义特性(Attribute) 在C#中,特性(Attribute)是一种可用于向类、方法、属性等程序实体添加元数据的语言功能。它可以使得代码更加灵活、可读性更高。 C#自定义特性(Attribute)是程序员用来自定义特性的机制。例如,我们可以自定义自己的Attribut…

    C# 2023年6月7日
    00
  • C#中使用Microsoft Unity记录日志

    当我们的应用程序遇到错误时,我们需要及时捕获和记录错误信息以便于后期排查。在C#中使用Unity框架可以方便地实现日志记录,本文将详细讲解如何使用Unity框架记录日志。 1. 引入Unity框架 要使用Unity框架来记录日志,我们需要将Unity框架引入我们的项目中。我们可以通过NuGet程序包管理器来引入Unity框架。 Install-Package…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部