C#从数据库读取图片并保存、百度人脸识别面部码转换
从数据库读取图片并保存有两种方法:
-
将图片转换为二进制保存到数据库中,读取时再将二进制转换为图片;
-
在服务器本地保存图片,将本地图片路径保存到数据库中,读取时根据路径从本地读取图片。
方法一:将图片转换为二进制保存到数据库中
1.1 保存图片到数据库
首先需要将读取到的图片转换成二进制,然后将二进制数据存储到数据库中。在C#中,我们可以使用MemoryStream和BinaryWriter对象将图片转成二进制数据并保存到数据库中。示例代码如下:
// 读取本地图片转成二进制后保存到数据库中
public static void SaveImageToDatabase(string imagePath, int id)
{
byte[] fileData = null;
// 读取图片,并将二进制数据保存到 fileData 变量中
using (FileStream fs = new FileStream(imagePath, FileMode.Open))
{
using (MemoryStream ms = new MemoryStream())
{
byte[] buffer = new byte[2048];
int bytesRead;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
}
fileData = ms.ToArray();
}
// 将二进制数据保存到数据库中
using (SqlConnection conn = new SqlConnection("数据连接字符串"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("INSERT INTO ImageTable (ID,ImageData) VALUES (@ID,@ImageData)", conn))
{
cmd.Parameters.AddWithValue("@ID", id);
cmd.Parameters.AddWithValue("@ImageData", fileData);
cmd.ExecuteNonQuery();
}
}
}
}
1.2 从数据库中读取图片
当我们需要从数据库中读取图片时,我们先读取二进制数据,然后再将二进制数据转换为图片。在C#中,我们可以使用BinaryReader和MemoryStream对象将二进制数据转成图片。示例代码如下:
// 从数据库中读取二进制数据并转成图片
public static Image GetImageFromDatabase(int id)
{
byte[] fileData;
using (SqlConnection conn = new SqlConnection("数据连接字符串"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT ImageData FROM ImageTable WHERE ID=@ID", conn))
{
cmd.Parameters.AddWithValue("@ID", id);
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
fileData = (byte[])reader["ImageData"];
using (MemoryStream ms = new MemoryStream(fileData))
{
return Image.FromStream(ms);
}
}
}
}
}
return null;
}
方法二:在服务器本地保存图片,将本地图片路径保存到数据库中
2.1 保存图片到本地
我们可以在服务器本地建立一个目录用于保存图片,然后将读取到的图片保存到该目录内。在C#中,我们可以使用File.Copy方法实现。示例代码如下:
// 读取本地图片并保存到本地目录中
public static string SaveImageToLocal(string imagePath, string saveDir)
{
// 生成保存文件的路径和文件名
string fileName = Path.GetFileName(imagePath);
string savePath = Path.Combine(saveDir, fileName);
// 将文件拷贝到本地目录上
File.Copy(imagePath, savePath, true);
return savePath;
}
2.2 保存本地图片路径到数据库中
当我们需要将本地图片路径保存到数据库中时,我们可以使用方法一中介绍的方法将路径转换为二进制数据保存到数据库中。示例代码如下:
// 将本地图片路径保存到数据库中
public static void SaveImagePathToDatabase(string imagePath, int id)
{
// 将路径转换成二进制数据
byte[] fileData = Encoding.UTF8.GetBytes(imagePath);
// 将二进制数据保存到数据库中
using (SqlConnection conn = new SqlConnection("数据连接字符串"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("INSERT INTO ImageTable (ID,ImagePathData) VALUES (@ID,@ImagePathData)", conn))
{
cmd.Parameters.AddWithValue("@ID", id);
cmd.Parameters.AddWithValue("@ImagePathData", fileData);
cmd.ExecuteNonQuery();
}
}
}
2.3 从数据库中读取本地图片路径
当我们需要从数据库中读取本地图片路径时,我们可以使用方法一中介绍的方法将二进制数据转换为路径。示例代码如下:
// 从数据库中读取本地图片路径
public static string GetImagePathFromDatabase(int id)
{
byte[] fileData;
using (SqlConnection conn = new SqlConnection("数据连接字符串"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT ImagePathData FROM ImageTable WHERE ID=@ID", conn))
{
cmd.Parameters.AddWithValue("@ID", id);
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
fileData = (byte[])reader["ImagePathData"];
return Encoding.UTF8.GetString(fileData);
}
}
}
}
return null;
}
2.4 将base64位string类型的人脸编码转化byte[] ,再转换成图片的Source,才能将人脸显示到页面的图片框中。
//Image控件显示数据库中面部编码图像
byte[] base64 = Convert.FromBase64String("base64类型的面部字节码");
Image1.Source = (BitmapSource)new ImageSourceConverter().ConvertFrom(base64);
//background属性显示数据库中的面部编码图像
ImageBrush ib = new ImageBrush();
byte[] base64 = Convert.FromBase64String("base64类型的面部字节码");
ib.ImageSourse = (BitmapSource)new ImageSourceConverter().ConvertFrom(base64);
//Border控件背景图片设置
border1.Background = ib;
//Grid控件背景图片设置
grid1.BackGround = ib;
WPF将页面Imag控件的Source源的图片保存到本地
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((BitmapSource)img1.Source));
string path = Environment.CurrentDirectory + @"\00.png";
FileStream file = new FileStream(path, FileMode.Create);
encoder.Save(file);
file.Close();
BitmapSource 和 byte[] 数据之间互转(WPF中Image.Source的数据类型就是BitmapSource )
//将byte[]数据转换成WPF中Image.Source可用的图片源头(例如:img.Source = bitmapImage;)
private static BitmapImage ConvertToBitmap(byte[] bytes)
{
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(bytes);
bitmapImage.EndInit();
return bitmapImage;
}
//Image.Source数据转换成byte[]数据
private byte[] ConvertToBytes(BitmapSource bitmapSource)
{
byte[] buffer = null;
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.Save(memoryStream);
memoryStream.Position = 0;
if (memoryStream.Length > 0)
{
using (BinaryReader br = new BinaryReader(memoryStream))
{
buffer = br.ReadBytes((int)memoryStream.Length);
}
}
memoryStream.Close();
return buffer;
}
private static BitmapImage ConvertToBitmap(BitmapSource bitmapSource)
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
BitmapImage bImg = new BitmapImage();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.Save(memoryStream);
memoryStream.Position = 0;
bImg.BeginInit();
bImg.StreamSource = memoryStream;
bImg.EndInit();
memoryStream.Close();
return bImg;
}
public static byte[] BitmapImageToBytes(BitmapImage bmp)
{
byte[] buffer = null;
try
{
Stream stream = bmp.StreamSource;
if (stream != null && stream.Length > 0)
{
//很重要,因为Position经常位于Stream的末尾,导致下面读取到的长度为0。
stream.Position = 0;
using (BinaryReader br = new BinaryReader(stream))
{
buffer = br.ReadBytes((int)stream.Length);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return buffer;
}
指纹器和人脸摄像头设备的Bitmap图片和base64编码之间互转
public static Bitmap Base64StringToImage(string inputStr)
{
try
{
byte[] arr = Convert.FromBase64String(inputStr);
MemoryStream ms = new MemoryStream(arr);
Bitmap bmp = new Bitmap(ms);
ms.Close();
return bmp;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
return null;
}
}
public static string ToBase64(Bitmap bmp)
{
try
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Jpeg);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
String strbaser64 = Convert.ToBase64String(arr);
return strbaser64;
}
catch (Exception ex)
{
return "";
}
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_57242877/article/details/133037190