Asp.net MVC значок визуализации - PullRequest
1 голос
/ 02 ноября 2011

Я хочу показать значок, связанный с типом файла.Что-то вроде этогоenter image description here

Но фон черный (в Firefox и IE), в Chrome он прозрачный, и это хорошо.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

view (я использую сетку 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 - возвращает Icon.

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;
            }

меняю метод GetFileTypeInfo: теперь он возвращает Icon

 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");
        }

теперь его рендерхорош в Chrome, Firefox, Safari и Opera, но в умрет IE IE его нет.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Это похоже на проблему с изображением.Можете ли вы попробовать добавить img { border: 0; } в файл site.css, чтобы посмотреть, поможет ли это?

0 голосов
/ 02 ноября 2011

Это просто выстрел в темноте, но когда вы возвращаете свое изображение в первом примере, MIME-тип неверен. Вместо этого вы должны вернуть "image/png". Растровые изображения не поддерживают прозрачность, что объясняет, почему значки становятся непрозрачными.

...