2011-11-02 168 views
1

我想显示与文件类型关联的图标。这样
enter image description hereasp.net mvc图标渲染

但背景是什么为黑色(在Firefox和IE),在铬它是透明的,其良好的。
enter image description here

我控制器

public ActionResult GetFileTypeIcon(string fileName) 
     { 
      var photo = PhotoModel.GetFileTypeIcon(fileName); 

      if (photo == null) 
      { 
       return File(Url.Content("~/Content/Images/nofile.png"), "image/png"); 
      } 

      var stream = new MemoryStream(photo); 


      return File(stream.ToArray(), "image/bmp"); 
     } 

我也试着图标转换成PNG但比图像质量很不好。

var stream = new MemoryStream(photo); 

      var iconStream = new MemoryStream(); 

      Image.FromStream(stream).Save(iconStream, System.Drawing.Imaging.ImageFormat.Png); 

      return File(stream.ToArray(), "image/png"); 

enter image description here

视图(我使用的DevExpress网格)

@Html.DevExpress().GridView(settings => 
{ 
    settings.Name = "attachmentsGrid"; 

    settings.Columns.Add(col => 
    { 
     col.Caption = "Назва"; 

     col.SetDataItemTemplateContent(c => 
     { 
      ViewContext.Writer.Write("<table><tr><td>"); 

      //Html.DevExpress().BinaryImage(imageSettings => 
      //{ 
      // imageSettings.Width = 16; 
      // imageSettings.Height = 16; 
      //}).Bind(PhotoModel.GetFileTypeIcon(DataBinder.Eval(c.DataItem, "_name").ToString())).Render(); 
      ViewContext.Writer.Write("<img height=\"16px\" width=\"16px\" src=\"" + Url.Action("GetFileTypeIcon", "Photo", new { fileName = DataBinder.Eval(c.DataItem, "_name").ToString() }) + "\" alt=\"image\" />"); 
      ViewContext.Writer.Write("</td><td>"); 
      ViewContext.Writer.Write("&nbsp&nbsp"); 
      ViewContext.Writer.Write(
       Html.ActionLink(DataBinder.Eval(c.DataItem, "_name").ToString(), "Download", new { Link = DataBinder.Eval(c.DataItem, "_link"), Name = DataBinder.Eval(c.DataItem, "_name") })); 
      ViewContext.Writer.Write("</td></tr></table>"); 
     }); 
    }); 

和方法这就是返回图像作为字节数组。 RegisteredFileType.ExtractIconFromFile - 返回一个图标。

public static byte[] GetFileTypeIcon(string filename) 
     { 
      try 
      { 
       byte[] array; 
       var fileType = filename.Split('.').LastOrDefault(); 
       fileType = "." + fileType.ToLower(); 
       string fileAndParam = (_iconsInfo[fileType]).ToString(); 

       if (String.IsNullOrEmpty(fileAndParam)) 
        return null; 

       var icon = RegisteredFileType.ExtractIconFromFile(fileAndParam, false); 

       using (var ms = new MemoryStream()) 
       { 
        icon.ToBitmap().Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
        array = ms.ToArray(); 
       } 

       return array; 
      } 
      catch (Exception) 
      { 
       return null; 
      } 

我是改变methhod GetFileTypeInfo:现在它返回图标

var icon = RegisteredFileType.ExtractIconFromFile(fileAndParam, false); 
       return icon; 

和控制器

public ActionResult GetFileTypeIcon(string fileName) 
     { 
      var photo = PhotoModel.GetFileTypeIcon(fileName); 

      if (photo == null) 
      { 
       return File(Url.Content("~/Content/Images/nofile.png"), "image/png"); 
      } 

      var stream = new MemoryStream(); 
      photo.ToBitmap().Save(stream, System.Drawing.Imaging.ImageFormat.Png); 


      var iconStream = new MemoryStream(); 

      Image.FromStream(stream).Save(iconStream, System.Drawing.Imaging.ImageFormat.Bmp); 

      return File(stream.ToArray(), "image/png"); 
     } 

现在,它呈现良好的浏览器,Firefox,Safari和Opera,但在模IE IE没有。

回答

2

看起来像图像更大胆的问题。你可以尝试添加img { border: 0; }到你的site.css文件,看看它是否有帮助吗?

+0

谢谢,这个工程。 –

0

这只是在黑暗中拍摄的,但是当您在第一个示例中返回图像时,mimetype是错误的。您应该返回"image/png"。位图不支持透明度,这可以解释为什么图标变得不透明。

+0

我已经编辑我的问题,如果我返回“图像/ PNG”的结果也很糟糕。 –

+0

你使用什么格式的图标? – allansson

+0

格式是System.Drawing.Icon –