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日

相关文章

  • C# IFF图形结构解析代码

    下面我将为您详细讲解“C# IFF图形结构解析代码”的完整攻略,包括基本概念、示例代码和应用方法。 什么是IFF图形结构? IFF全称为Interchange File Format,是一种通用的文件格式,广泛用于图像、声音、动画、视频等文件的交换和存储。IFF格式的文件通常由块(Chunk)构成,每个块由标识、长度和数据三部分组成。其中标识(FOURCC)…

    C# 2023年6月1日
    00
  • 使用C# Winform应用程序获取网页源文件的解决方法

    非常感谢您对我提出的问题。以下是使用C# Winform应用程序获取网页源文件的解决方法的完整攻略: 1. 确定需求 在开始之前,我们需要确定我们的需求,为什么要获取网页源文件。例如,我们可能希望: 分析网站结构和内容 检查特定页面的元素、标签、属性等 自动化爬取网站数据 不管我们的需求是什么,获取网页源文件都是必不可少的第一步。下面将介绍基于C# Winf…

    C# 2023年6月1日
    00
  • C#实现简单计算器功能

    C#实现简单计算器功能的攻略如下: 步骤一:设计用户界面 首先,我们需要设计一个用户界面,提供给用户输入数据和操作符的地方,并在可视化界面上展示所得结果。为此,我们可以使用Visual Studio自带的Windows Forms应用程序快捷模板。打开Visual Studio,新建Windows Forms应用程序,然后在“工具箱”中选取TextBox、B…

    C# 2023年6月7日
    00
  • ASP.NET Core中使用xUnit进行单元测试

    ASP.NET Core中使用xUnit进行单元测试攻略 在ASP.NET Core中,xUnit是一种流行的单元测试框架。在本攻略中,我们将深入讲解如何使用xUnit进行单元测试,并提供两个示例说明。 xUnit的安装 在使用xUnit进行单元测试之前,我们需要安装xUnit。以下是安装xUnit的步骤: 在Visual Studio中,打开NuGet包管…

    C# 2023年5月17日
    00
  • .NET垃圾回收GC诊断工具dotnet-gcmon使用

    在本文中,我们将详细讲解如何使用.NET垃圾回收(GC)诊断工具dotnet-gcmon,并提供两个示例说明。 准备工作 在开始之前,您需要安装以下软件: .NET Core SDK dotnet-gcmon 安装dotnet-gcmon 安装dotnet-gcmon。 dotnet tool install -g dotnet-gcmon 在上面的命令中,…

    C# 2023年5月16日
    00
  • C#加密算法汇总(推荐)

    C#加密算法汇总(推荐) 简介 本文主要介绍C#语言中常用的加密算法。涉及到的加密算法包括对称加密算法和非对称加密算法。对称加密算法包括DES、AES、RC4等,其中DES和AES已经成为最经典的对称加密算法,RC4算法常被用于数据流加密。非对称加密算法包括RSA和DSA等,其中RSA算法用于数字签名,DSA算法用于数字证书。 DES加密算法 DES加密算法…

    C# 2023年6月6日
    00
  • C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法

    C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法可以通过以下步骤进行实现: 1. 创建矩阵并填充数据 首先,我们需要创建一个矩阵并填充数据。以一个3×3的矩阵为例: int[,] matrix = new int[3, 3]{ {2, 4, 6}, {4, 5, 8}, {6, 8, 9} }; 2. 构造矩阵的对称矩阵与反称矩阵 接下来,我们需要构造矩…

    C# 2023年6月8日
    00
  • 基于C#实现网络爬虫 C#抓取网页Html源码

    下面是“基于C#实现网络爬虫 C#抓取网页Html源码”的完整攻略: 一、网络爬虫简介 网络爬虫,也称为网络蜘蛛、网络机器人等,是一种自动化的程序,用于在互联网上通过各种方式获取信息。 二、C#抓取网页Html源码 1. 使用C#自带的WebClient类 C#自带的WebClient类可以轻松地访问网页,并将其HTML源码下载到本地。下面是一个示例代码: …

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