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日

相关文章

  • ASP.NET Core中的Http缓存使用

    ASP.NET Core中的Http缓存使用攻略 在 ASP.NET Core 中,我们可以使用 HTTP 缓存来提高应用程序的性能和响应速度。本攻略将介绍如何在 ASP.NET Core 中使用 HTTP 缓存。 步骤 以下是使用 HTTP 缓存的步骤: 在 Startup.cs 文件中启用缓存。 在 Startup.cs 文件中的 ConfigureSe…

    C# 2023年5月17日
    00
  • 在asp.net中使用加密数据库联接字符串保证数据安全

    在ASP.NET中,可以使用加密数据库连接字符串的方式来保障数据库的安全性。具体步骤如下: 1. 生成加密密钥 在ASP.NET中,可以使用System.Web.Security中的方法生成一个加密密钥。在Global.asax.cs中添加以下代码: void Application_Start(object sender, EventArgs e) { /…

    C# 2023年5月31日
    00
  • C# 键值对数据排序代码

    下面我为大家详细讲解 “C# 键值对数据排序代码”的完整攻略: 1. Sort方法的基本使用 C#中的Dictionary是一个非泛型的键/值对集合,它使用哈希表来实现。由于哈希表的一个重要特性是元素的顺序无法保证,因此在某些情况下,我们可能需要像对List< T>那样对Dictionary进行排序。 Dictionary没有提供Sort或Sor…

    C# 2023年6月8日
    00
  • C#抽象类的用法介绍

    C#抽象类的用法介绍 在 C# 中,抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类通常用于定义一些基础的行为和属性,而具体的实现则由其类来完成。下面是抽象类用法介绍: 定义抽象类 在 C# 中,可以使用 abstract 关键字来定义一个抽象类。抽象类通常包含一些抽象方法和非抽象方法。抽象方法是一种没有实现的方法,它只包含方法签名,而不包含方法体。…

    C# 2023年5月12日
    00
  • 聊聊Unity 自定义日志保存的问题

    针对“聊聊Unity自定义日志保存的问题”,我可以提供以下完整攻略: 1. 了解Unity自带的日志系统 Unity自己的日志系统提供了五个级别的日志输出,分别是:Log、Warning、Error、Assert和Exception。日志输出的级别可以通过Debug.unityLogger.filterLogType属性来控制。我们可以通过在代码中使用Deb…

    C# 2023年5月15日
    00
  • 大白话讲解C# 中的委托

    大白话讲解C# 中的委托 什么是委托? 在C#中,委托是一种类型,它可以封装一个或一组方法,供其他代码调用。简单来说,它就是函数指针的一种类型安全实现。 委托的定义和使用 可以使用 delegate 关键字定义委托,如下所示: public delegate void DelegateType(int param); 上面这段代码中,我们定义了一个名为 De…

    C# 2023年6月7日
    00
  • ASP.NET Core MVC 从入门到精通之wwwroot和客户端库

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月25日
    00
  • C#对接阿里云IOT平台进行设备开发

    C#对接阿里云IOT平台进行设备开发攻略 1. 阿里云IOT平台的设备接入 阿里云IOT平台提供了很多设备接入的方式,包括TCP、HTTP、MQTT等多种协议,此处我们主要介绍MQTT协议的接入方式。 在阿里云IOT平台控制台创建一个设备,并获取该设备的设备证书(ProductKey、DeviceName、DeviceSecret); 新建一个C#控制台应用…

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