2013-12-12 40 views
0

編輯完成後,我必須更新存儲在數據庫中的條形圖。 我有大約20小時看例子,但把它放在一起。 我班MVC4 EF5更新位圖圖像 - 保存分貝

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 ????
- 將內存轉換爲字節數組
- 引用byte []到TaskImage字段
- 告訴.State我們有一個修改....... db.Entry(task).State = EntityState.Modified;
- 保存更改..覆蓋現有圖像.... db.SaveChanges();

我認爲這是正確的邏輯。我正在做一個完整的重繪而不是修改現有的圖像,所以我不需要先檢索它。 順便說一句,我得到這個工作後,我會改變代碼存儲在一個相關的表中的TaskImage,而不是在這裏編輯表。我不認爲這會改變你答案的結構。

有很多檢索和傳遞的例子來查看。我想我可以解決這個問題。

難倒!由於

回答

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(); 

我希望這可以幫助別人。 要檢索該圖像,並顯示在視圖中看到這樣一個問題:圖片爲byte []比想象的更難2個challanges

0

僞代碼:
- 保存創建圖像的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中。

事實上,「問題或錯誤」不是很清楚。

這真的是一個問題。如何將圖像轉換爲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; 
    } 

編輯: 公共類任務 { 公衆詮釋的TaskID {獲得;組; } public DateTime? SStart {get;組; } public DateTime? SEEND {get;組; } public DateTime? SCert {get;組; } 公用字節? Taskimage {get;組; } // < < < < < < make Byte Array ?????? } 我的控制器:一旦你弄清楚它非常簡單,這個工程

[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(); 

}

+0

我見過的往返,但無法弄清楚如何採取「返回」寫它到EF表中的TaskImage字段。 – user2887440

+0

如何將原則轉換爲內嵌代碼。這是「返回」並將其寫入EF表中的TaskImage字段。這似乎是行image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg)將圖像保存到ms。 ms.ToArray)將其轉換爲字節[]。現在我需要代碼將.ToArray()分配給TaskImage。然後,我假設我的db.Entry ....將更新記錄。@ philsoady – user2887440

+0

是的問題是如何從內存流獲取db.save。像Task.TaskImage = ImageFromStream(ms.ToArray()); @phil – user2887440