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

yizhihongxing

下面是“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# WinForm实现自动更新程序之客户端的示例代码

    好的!本文将详细讲解“C# WinForm实现自动更新程序之客户端的示例代码”的完整攻略,包括以下内容: 前置知识 客户端代码示例 示例说明 前置知识 在讲解“C# WinForm实现自动更新程序之客户端的示例代码”之前,需要掌握一些前置知识: C#语言的基础语法 WinForm应用程序的基础知识 HTTP协议的基本原理及其在.NET中的应用 XML文档的基…

    C# 2023年6月1日
    00
  • DevExpress之SplashScreen用法实例

    关于“DevExpress之SplashScreen用法实例”的详细攻略,下面是我的完整分享。 导言 在开发Windows桌面应用程序时,我们常常需要使用启动画面(Splash Screen)来提高用户体验,并模拟加载过程。DevExpress控件库中提供了特定的控件 SplashScreenManager 来实现此功能。 下面我们就来详细讲解 Splash…

    C# 2023年6月6日
    00
  • C#实现语音视频录制-附demo源码

    标题:C#实现语音视频录制-附demo源码完整攻略 简介 本攻略旨在介绍如何使用C#实现语音视频录制的方法,并提供示例代码。该方法基于NAudio和AForge库,可以在Windows系统中实现对声音和视频的录制,并支持保存为MP4格式。 步骤 下载并安装NAudio和AForge库。 在项目中引用这两个库。 添加代码: private void Start…

    C# 2023年6月6日
    00
  • ASP.NET MVC HtmlHelper如何扩展

    ASP.NET MVC HtmlHelper是一个很强大的工具,它可以帮助我们在视图中构建HTML代码。但是,这些HtmlHelper可能无法满足我们的需求,因此我们需要扩展它们。下面是ASP.NET MVC HtmlHelper如何扩展的完整攻略: HTML Helper的扩展方法命名约定 要扩展HTML Helper,首先需要创建一个静态类并在其中创建一…

    C# 2023年5月31日
    00
  • C# 4.0 大数的运算–BigInteger的应用详解

    C#4.0大数的运算–BigInteger的应用详解 对于C#中的int、long等整型变量来说,其取值范围是固定的。如果要进行大数运算,就需要使用BigInteger类。 1. BigInteger基础知识 BigInteger类是System.Numerics命名空间下的一个类,用于处理大整数。它支持基本的算术运算、转换和比较操作。BigInteger…

    C# 2023年5月14日
    00
  • asp.net创建位图生成验证图片类(验证码类)

    下面是“ASP.NET创建位图生成验证图片类(验证码类)”的完整攻略: 什么是验证码 验证码是为了防止机器人恶意攻击而设置的一种机制。它一般是一张由数字或字母组成的随机图片,用户需要在文本框中输入正确的验证码,才能通过验证并继续执行后续的操作。所以,验证码一般被用于用户登录、注册、评论等操作中,以保障网站安全。 创建验证码类 1. 准备工作 准备一个名为“V…

    C# 2023年5月31日
    00
  • C#实现串口通信的示例详解

    下面我就开始详细讲解“C#实现串口通信的示例详解”的完整攻略。 总体介绍 首先我们需要了解C#实现串口通信的基本原理,即通过串口通信协议在计算机和设备之间进行数据的传输。常见的应用场景包括连接硬件设备、嵌入式系统通讯等。为了实现串口通信,需要使用C#编程实现数据的发送和接收。同时,我们还需要设置串口的各种参数,如波特率、数据位、校验位、停止位等,以确保稳定的…

    C# 2023年6月3日
    00
  • .NET Core系列之MemoryCache 初识

    .NET Core系列之MemoryCache 初识 在本攻略中,我们将详细讲解.NET Core中的MemoryCache,包括其基本概念、使用方法和示例说明。 MemoryCache简介 MemoryCache是.NET Core中的一个内存缓存库,可以用于缓存应用程序中的数据。它提供了一种快速、可靠和高效的方式来缓存数据,以提高应用程序的性能和响应速度…

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