我在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(图像图像)这个函数的适当位置在哪里?
答案 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();