FormImageSQL.cs

本文介绍了一种使用SQL数据库存储和管理图像的方法,包括如何加载、插入、删除和选择图像,以及提供图像预览、复制、保存和旋转功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

use master
go
if DB_ID('UserImage') is not null
   drop database UserImage
create database UserImage
go
use UserImage
go
create table Images
(
 Image_Name nvarchar(255) primary key,
 Image_Data Image not null
)
go
create proc InsertImage
(
 @Image_Name nvarchar(255),
 @Image_Data Image
)
as
insert into Images values(@Image_Name, @Image_Data)
go
create proc DeleteImage
(
 @Image_Name nvarchar(255)
)
as
delete from Images where Image_Name = @Image_Name
go
create proc SelectImage
(
 @Image_Name nvarchar(255)
)
as
select Image_Data from Images where Image_Name = @Image_Name
go

 

using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.ServiceProcess;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace ImageSQL
{
    public partial class FormImageSQL : Form
    {
        #region
        private ServiceController server;
        private SqlConnection sql;
        private DataTable table;
        private ChineseLunisolarCalendar lunarCalendar = new ChineseLunisolarCalendar();
        #endregion

        public FormImageSQL()
        {
            #region
            InitializeComponent();
            this.AllowDrop = true; // 启用拖放操作。
            this.TransparencyKey = this.BackColor; // 窗体背景透明化。
            pictureBoxIMG.BackColor = Color.Transparent; // 图像背景透明化。
            pictureBoxIMG.SizeMode = PictureBoxSizeMode.Zoom; // 图像大小按其原有的大小比例被增加或减小。
            openFileImage.Filter = "图像格式(*.BMP;*.GIF;*.JPG;*.PNG)|*.bmp;*.gif;*.jpg;*.png";
            openFileImage.Multiselect = true; // 允许选择多个文件。
            LoadData();
            DataGridViewStyle();
            toolComboBoxImage.AutoToolTip = true; // 显示工具提示。
            toolComboBoxImage.ComboBox.DisplayMember = "Name";
            toolComboBoxImage.ComboBox.DataSource = table.DefaultView;
            toolComboBoxImage.DropDownStyle = ComboBoxStyle.DropDownList;
            toolComboBoxImage.ComboBox.DrawMode = DrawMode.OwnerDrawFixed;
            toolComboBoxImage.ComboBox.DrawItem += new DrawItemEventHandler(toolComboBoxImage_DrawItem);
            #endregion
        }

        #region LoadData
        private void LoadData()
        {
            server = new ServiceController("MSSQLSERVER"); // "MSSQL$SQLEXPRESS"
            switch (server.Status)
            {
                case ServiceControllerStatus.Stopped:   // 服务未运行。
                    server.Start();                    // net start mssqlserver
                    break;
                case ServiceControllerStatus.Paused: // 服务已暂停。
                    server.Continue();              // net continue mssqlserver
                    break;
            }
        Run:
            {
                System.Threading.Thread.Sleep(500);
                server.Refresh(); // 通过将属性重置为其当前值来刷新属性值。
            }
            if (server.Status != ServiceControllerStatus.Running)
                goto Run;
            table = new DataTable();
            DataColumn column = table.Columns.Add("Name", typeof(String));
            table.Columns.Add("Image", typeof(Image));
            table.Constraints.Add("PK", column, true);
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder.DataSource = Environment.MachineName; // @"./SQLEXPRESS"
            builder.InitialCatalog = "UserImage";
            builder.IntegratedSecurity = true;
            builder.TypeSystemVersion = "SQL Server 2000"; // "SQL Server 2005"
            (sql = new SqlConnection(builder.ConnectionString)).Open();
            using (SqlCommand cmd = new SqlCommand("Select * from Images", sql))
            using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                int name = sdr.GetOrdinal("Image_Name");
                int img = sdr.GetOrdinal("Image_Data");
                table.BeginLoadData();
                while (sdr.Read())
                {
                    using (Stream ms = sdr.GetSqlBytes(img).Stream)
                    {
                        DataRow row = table.NewRow();
                        row.SetField<String>(0, sdr.GetString(name));
                        row.SetField<Image>(1, Image.FromStream(ms));
                        table.Rows.Add(row);
                    }
                }
                table.EndLoadData();
            }
        }
        #endregion

        #region ChineseLunisolarCalendar
        private void timerDate_Tick(object sender, EventArgs e)
        {
            Application.CurrentCulture.ClearCachedData();
            DateTime solar = DateTime.Now;
            int month = lunarCalendar.GetMonth(solar);
            int leapMonth = lunarCalendar.GetLeapMonth(lunarCalendar.GetYear(solar));
            if (0 < leapMonth && leapMonth <= month)
                --month;
            statusLabelTime.Text = string.Format("{0:F} [{1} {2:00}]", solar, DateTimeFormatInfo.CurrentInfo.MonthNames[month - 1], lunarCalendar.GetDayOfMonth(solar));
        }
        #endregion

        #region CopyImage
        private void toolButtonCopy_Click(object sender, EventArgs e)
        {
            Clipboard.SetImage(pictureBoxIMG.Image);
        }
        #endregion

        #region AddImage
        private void toolButtonAdd_Click(object sender, EventArgs e)
        {
            if (openFileImage.ShowDialog(this) == DialogResult.OK)
                ImageToMSSQL(openFileImage.FileNames);
        }

        protected override void OnDragEnter(DragEventArgs e)
        {
            base.OnDragEnter(e);
            this.Activate();
            DataObject data = e.Data as DataObject;
            if (data.ContainsFileDropList())
                ImageToMSSQL(data.GetFileDropList());
        }

        private void ImageToMSSQL(System.Collections.IEnumerable fileList)
        {
            foreach (string filePath in fileList)
            {
                if (!Regex.IsMatch(Path.GetExtension(filePath), @".(bmp|gif|jpg|png)", RegexOptions.IgnoreCase))
                    continue;
                string imgName = Path.GetFileName(filePath);
                if (table.Rows.Contains(imgName))
                {
                    MessageBox.Show(this, string.Format("图像“{0}”已存在!", imgName), "确认图片添加", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    toolComboBoxImage.Text = imgName;
                    continue;
                }
                DataRow row = table.NewRow();
                row.SetField<String>("Name", imgName);
                row.SetField<Image>("Image", Image.FromFile(filePath));
                table.Rows.Add(row);
                using (SqlCommand cmd = new SqlCommand("InsertImage", sql))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@Image_Name", SqlDbType.NVarChar, imgName.Length).Value = imgName;
                    byte[] bytes = File.ReadAllBytes(filePath);
                    cmd.Parameters.Add("@Image_Data", SqlDbType.Image, bytes.Length).SqlValue = bytes;
                    if (sql.State == ConnectionState.Closed)
                        sql.Open();
                    cmd.ExecuteNonQuery();
                    if (sql.State == ConnectionState.Open)
                        sql.Close();
                }
            }
        }
        #endregion

        #region DeleteImage
        private void toolButtonDelete_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show(this, string.Format("确实要删除“{0}”吗?", this.Text), "确认图片删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                using (SqlCommand cmd = new SqlCommand("DeleteImage", sql))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@Image_Name", SqlDbType.NVarChar, Text.Length).Value = this.Text;
                    if (sql.State == ConnectionState.Closed)
                        sql.Open();
                    cmd.ExecuteNonQuery();
                    if (sql.State == ConnectionState.Open)
                        sql.Close();
                    table.DefaultView.Delete(gridViewImage.CurrentCellAddress.Y);
                    toolButtonDelete.Enabled = (gridViewImage.CurrentCellAddress.Y > -1);
                }
        }
        #endregion

        #region DrawImage
        private void toolComboBoxImage_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index < 0)
                return;
            using (Graphics g = e.Graphics)
            using (SolidBrush sb = new SolidBrush(e.BackColor))
            {
                if ((e.State & DrawItemState.Selected) != 0) // 取交集。
                    sb.Color = Color.BlueViolet;
                Rectangle clip = e.Bounds;
                g.FillRectangle(sb, clip);
                clip.Offset(1, 1);
                clip.Width = 36;
                clip.Height -= 3;
                g.DrawRectangle(Pens.Black, clip);
                clip.Offset(1, 1);
                clip.Width -= 1;
                clip.Height -= 1;
                DataRow row = table.Rows[e.Index];
                g.DrawImage(row.Field<Image>("Image"), clip);
                sb.Color = e.ForeColor;
                g.DrawString(row.Field<String>("Name"), e.Font, sb, clip.X + 50, clip.Y);
            }
        }
        #endregion

        #region PaintImage
        private void toolButtonPaint_Click(object sender, EventArgs e)
        {
            using (Process psi = new Process())
            {
                psi.StartInfo.FileName = "mspaint.exe"; // 启动画图。
                psi.StartInfo.WorkingDirectory = Environment.SystemDirectory;
                psi.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
                psi.Start();
            }
        }
        #endregion

        #region RotateImage
        private void toolButtonRotate_Click(object sender, EventArgs e)
        {
            RotateFlipType rft = sender.Equals(toolButtonLeft) ? RotateFlipType.Rotate90FlipXY : RotateFlipType.Rotate90FlipNone;
            pictureBoxIMG.Image.RotateFlip(rft); // 旋转和翻转图像。
            pictureBoxIMG.Refresh(); // 刷新图片。
            gridViewImage.Refresh(); // 刷新图片。
            toolComboBoxImage.ComboBox.Refresh(); // 刷新图片。
        }
        #endregion

        #region SaveImage
        private void toolButtonSave_Click(object sender, EventArgs e)
        {
            using (Bitmap bmp = new Bitmap(pictureBoxIMG.Image))
            {
                bmp.Save(Path.Combine(Application.StartupPath, this.Text));
            }
            Process.Start(Application.StartupPath);
            System.Threading.Thread.Sleep(300);
            SendKeys.SendWait(this.Text);
        }
        #endregion

        #region DataGridViewStyle
        private void DataGridViewStyle()
        {
            DataGridViewImageColumn imgColumn = new DataGridViewImageColumn();
            imgColumn.DataPropertyName = "Image";
            imgColumn.ImageLayout = DataGridViewImageCellLayout.Zoom; // 将图形按比例放大,直到达到其所在单元格的宽度或高度。
            imgColumn.Width = 128; // 设置图片宽度。
            gridViewImage.Columns.Add(imgColumn);
            gridViewImage.RowTemplate.Height = 128; // 设置图片高度。
            gridViewImage.BorderStyle = BorderStyle.Fixed3D;
            gridViewImage.BackgroundColor = this.BackColor;
            gridViewImage.AutoGenerateColumns = false; // 禁用自动创建列。
            gridViewImage.AllowUserToAddRows = false; // 隐藏添加行。
            gridViewImage.AllowUserToDeleteRows = false; // 禁用删除行。
            gridViewImage.AllowUserToResizeRows = false; // 禁用调整行的大小。
            gridViewImage.AllowUserToResizeColumns = false; // 禁用调整列的大小。
            gridViewImage.ColumnHeadersVisible = false; // 隐藏列标题。
            gridViewImage.RowHeadersVisible = false; // 隐藏行标题。
            gridViewImage.ReadOnly = true; // 禁用编辑单元格。
            gridViewImage.MultiSelect = false; // 用户仅能选择一个单元格、行或列。
            gridViewImage.ShowCellToolTips = true; // 显示单元格工具提示。
            gridViewImage.CellToolTipTextNeeded += new DataGridViewCellToolTipTextNeededEventHandler(gridViewImage_CellToolTipTextNeeded);
            gridViewImage.SelectionChanged += new EventHandler(gridViewImage_SelectionChanged);
            gridViewImage.DataSource = table.DefaultView;
        }

        private void gridViewImage_SelectionChanged(object sender, EventArgs e)
        {
            DataGridViewCell cell = gridViewImage.CurrentCell;
            if (cell != null)
            {
                this.Text = cell.ToolTipText;
                pictureBoxIMG.Image = cell.FormattedValue as Bitmap;
            }
            toolButtonDelete.Enabled = (cell != null);
            toolButtonSave.Enabled = toolButtonCopy.Enabled = (pictureBoxIMG.Image != null);
        }

        private void gridViewImage_CellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e)
        {
            e.ToolTipText = table.DefaultView[e.RowIndex][0] as string;
        }

        private void pictureBoxIMG_MouseClick(object sender, MouseEventArgs e)
        {
            CurrencyManager manager = BindingContext[table.DefaultView] as CurrencyManager;
            switch (e.Button)
            {
                case MouseButtons.Left:
                    --manager.Position;
                    break;
                case MouseButtons.Right:
                    ++manager.Position;
                    break;
            }
        }
        #endregion
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值