MVC4 EF5更新位图图像 - 在db中保存

时间:2013-12-12 02:36:25

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

编辑后,我必须更新存储在数据库中的条形图。 我有大约20个小时看例子,但只是把它放在一起。 我的班级

public class Task
{
    public int TaskID { get; set; }
    public DateTime? SStart { get; set; }
    public DateTime? SEnd { get; set; }
    public DateTime? SCert { get; set; }
    public byte? Taskimage { get; set; }
}

我的控制器:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(Task task)
    {
        if (ModelState.IsValid)
        {   db.Entry(task).State = EntityState.Modified;
            db.SaveChanges();
            // now create a new graph using the returned viewbag data

            var Mytopleft = 0;
            var Mytext = "";
            Bitmap mybmp = new Bitmap(400, 20);
            Graphics g = Graphics.FromImage(mybmp);
            g.DrawRectangle(Pens.Black, 0, 0, 400, 20);
            SolidBrush b = new SolidBrush(Color.OldLace);
            g.FillRectangle(b, 0, 0, 400, 20);
            // draw comma-delimited elements in multiple colors
            string[] chunks = Mytext.Split(',');
            var brush = new SolidBrush(Color.Black);
            SolidBrush[] brushes = new SolidBrush[] 
                {   new SolidBrush(Color.OldLace),          //removed 3 other brushes for clarity
                 };
            int c = 0;
            var tasks = db.Tasks.Include(t => t.Builder).Include(t => t.Lot);
            foreach (var titem in tasks.ToList())
            {
                if (titem.SStart == null)
                { c = 0; }
                else if (titem.SStart != null && titem.SEnd == null)
                { c = 1; }                             //removed 3 other cases for clarity
                // create a new rectangle displaced by offset and with color
                g.FillRectangle(brushes[c], Mytopleft, 0, 10, 20);
                Mytopleft += 10;
            }                
                               //write to folder as a test   this works  Gif is arbitrary.
                              //can't use c:\\lot1.bmp   -- can't write to root dir
            mybmp.Save("C:\\temp\\lot1.gif", System.Drawing.Imaging.ImageFormat.Gif);

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

            db.SaveChanges();
}

因此,在更改日期后,我会修改条形图并更新存储在数据库中的TaskImage图像。

创建mybmp可以将文件作为测试写入临时文件夹。

我一直在努力了解如何将mybmp保存到TaskImage。我认为我的困惑部分是作业,在我以前的日子里我会做类似mybmp = toarry(System.Drawing.Imageing.ImageFormat.Gif)的事情。我认为这不适用于MVC C#。我认为图像实际上是在System.Drawing.Image中创建和修改的。

所以概括:MVC4 EF5代码首先是 - 将创建的图像保存到memorystream ???? - 将memorystream转换为字节数组
- 将byte []引用到TaskImage字段
- 告诉.State我们有一个修改....... db.Entry(task).State = EntityState.Modified;
- 保存更改..覆盖现有图像.... db.SaveChanges();

我认为这是正确的逻辑。我正在做一个完整的重绘而不是修改现有的图像,所以我不需要先检索它。 在我开始工作之后,我将更改代码以将TaskImage存储在相关表中而不是此处编辑的表中。我认为这不会改变你答案的结构。

有许多检索和传递给视图的例子。我想我可以处理。

难倒!!感谢

2 个答案:

答案 0 :(得分:0)

伪代码:
- 将创建的图像保存到memorystream ???? - 将memorystream转换为字节数组
- 将byte []引用到TaskImage字段
- 告诉.State我们有一个修改....... db.Entry(task).State = EntityState.Modified;
- 保存更改..覆盖现有图像.... db.SaveChanges();

看起来不错。

为什么代码?

mybmp.Save("C:\\temp\\lot1.gif", System.Drawing.Imaging.ImageFormat.Gif);

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

您要保存到文件或EF表吗?标题说保存在Db。

事实上,“问题或错误”并不清楚。

这真的是一个问题。如何将Image转换为byteArray并返回? 由于从具有Byte []类型字段的DB保存和检索记录不是问题吗? 所以我想你需要这个

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

    public static Image ByteArrayToImage(byte[] byteArray)
    {
        var memoryStream = new MemoryStream(byteArray);
        Image image = Image.FromStream(memoryStream);
        return image;
    }

修改 公共课任务 {     public int TaskID {get;组; }     公共日期时间? SStart {get;组; }     公共日期时间?发送{得到;组; }     公共日期时间? SCert {得到;组; }     公共字节? Taskimage {get;组; } //<<<<<<制作字节数组?????? } 我的控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Task task)
{
    if (ModelState.IsValid)
    {   


        // 
        // now create a new graph using the returned viewbag data
      Image graph = CreateImageFromViewBag(viewbag); // refactored out... 
      task.Image =  ImageToByteArray(graph);

       db.Entry(task).State = EntityState.Modified;


        db.SaveChanges();

}

答案 1 :(得分:0)

在这里帮助其他人正在运行代码 和许多事情一样,一旦你弄明白,这很简单。这写入相关表,因此lottoupdate。

mybmp.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        byte[] byteArray = new byte[0];
        ms.Close();
        var lottoupdate = db.Lots             //each task row contains the lotid to which
               .Where(i => i.LotID == lotID)  //it is associated. Find the LotID then
               .Single();                    // update the taskimage field in the lot class
         byteArray = ms.ToArray();
        lottoupdate.TaskImage = byteArray;
        db.Entry(lottoupdate).State = EntityState.Modified;
        db.SaveChanges();

我希望这有助于其他人。 要检索此图像并在视图中显示,请参阅此问题:图像到字节[]比想象的更难2挑战