如何将位图保存到我的数据库?

时间:2013-12-17 22:26:51

标签: asp.net-mvc entity-framework bitmap

我在System.Drawing中有一个位图。我知道它必须转换为一个byte []存储在我的表中。

我的表格字段:

public class Task
public byte? TaskImage { get; set; }

到目前为止我在行代码中有这个:

MemoryStream ms = new MemoryStream();
mybmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);


Task.TaskImage = 
db.SaveChanges();

我已经引用了这个:

public static byte[] ImageToByteArray(Image image)
{
var memoryStream = new MemoryStream();
image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); // consider format
return memoryStream.ToArray();
}

但无法弄清楚如何应用它。这种尝试不起作用。

Task.TaskImage = Image.FromStream(ms.ToArray())

有人可以提供代码从内联代码中的System.Drawing到Task.TaskImage =,或者如何在我的代码中引用函数ImageToByteArray(图像图像)?在我的MVC项目中,如果使用了ImageToByteArray(图像图像)这个函数的适当位置在哪里?

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。

我看到的一个错误是

public byte? TaskImage { get; set; }

需要是一个字节数组。那只是一个可以为空的字节。将其更改为

public byte[] TaskImage { get; set; }

什么是图像?我们如何存储它?

在最简单的形式中,图像只是以特定方式组织的一系列位(就像存储在计算机上的任何虚拟对象一样)。

数据库不是很擅长存储复杂类型的数据;它们通常存储字符串(例如varchar),各种大小的整数,浮点数,布尔值(一点)等等。为了存储像图像一样复杂的东西,我们必须将图像分割成字节并将其分配给数据库(它们可以轻松处理字节(位组))。你好像都知道这一切。

为了将图像保存到数据库,我们需要知道它的格式,我们需要能够读取图像的所有字节。

Streams(What is a stream?)在这里很有用。它们允许我们读写字节序列。像Image这样的.NET类对于加载图像信息也很有用。

从数据库中读取图像

假设我们将一个图像存储为数据库中的字节数组。实体框架为我们加载对象作为Task对象。

public class Task
{
    public byte[] TaskImage { get; set; }
}

加载图片:

Task task;
var ms = new MemoryStream(task.TaskImage);
Image img = Image.FromStream(ms);

或者

Bitmap bmp = new Bitmap(ms);

将图像保存到数据库

Task task = new Task();

MemoryStream ms = new MemoryStream();
Image img = Image.FromFile("...");
img.Save(ms, img.RawFormat);
ms.Position = 0;

task.TaskImage = new byte[ms.Length];
ms.Read(TaskImage, 0, (int)ms.Length);

dbContext.Tasks.Add(task);
dbContext.SaveChanges();