Автообновление изображения (без javascript, flash, silverlight)

Я хотел бы отобразить изображение, которое меняет свое содержимое каждые 2 секунды (или что-то в этом роде). К сожалению, я не могу использовать JavaScript, Flash или Silverlight, потому что хочу использовать анимацию в исходящих html-письмах с максимальной совместимостью между различными почтовыми клиентами.

Итак, я попытался сгенерировать образ с помощью обработчика .ashx. Но я не могу обновить изображение (или повторно выполнить обработчик ashx). Я пробовал петлю, но это не сработало.

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/png";

        string strDisplay = DateTime.Now.ToString();

        Bitmap bmpOut = new Bitmap(400, 50);
        Graphics g = Graphics.FromImage(bmpOut);
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.FillRectangle(Brushes.Black, 0, 0, 400, 50);
        g.DrawString(strDisplay, new Font("Verdana", 18), new SolidBrush(Color.White), 0, 0);

        MemoryStream ms = new MemoryStream();
        bmpOut.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        byte[] bmpBytes = ms.GetBuffer();
        bmpOut.Dispose();
        ms.Close();

        context.Response.BinaryWrite(bmpBytes);
        context.Response.End();

    }

Как мне это сделать, или есть другое решение?

Изменить. Содержание изображения не определено заранее. Он содержит, например, список твитов.

Изменить: В настоящее время мы пытаемся использовать MJPEG. Кто-нибудь знает больше об этом и почтовых клиентах?

Помощь очень ценится,

Винсент


person Vinzcent    schedule 18.11.2011    source источник


Ответы (3)


Прочитав некоторые комментарии, кажется, что реальный вопрос заключается в том, как отобразить анимированную последовательность изображений в электронном письме.

Вам почти никогда не разрешается запускать JavaScript внутри почтовых клиентов, и даже если бы вы могли, поддержка может сильно различаться между клиентами, а клиенты веб-почты могут все испортить. Так что этот вариант отпал.

Точно так же Flash / Silverlight вряд ли будут иметь хорошую поддержку почтовыми клиентами и требуют установки плагина для браузера, что может быть невозможно для некоторых программных почтовых клиентов для настольных компьютеров. Так что этот вариант отпал.

Итак, у нас остались анимированные GIF-изображения. Этот формат поддерживается уже очень давно в «интернет-время». Тем не менее, вам нужно помнить о двух вещах:

  1. Большинство почтовых клиентов теперь блокируют изображения (на самом деле все внешние ресурсы), пока пользователь явно не нажмет «показать изображения и ссылки» или что-то подобное в своем почтовом клиенте. Это означает, что все еще нет гарантии, что они увидят ваше изображение. Возможно, вы сможете встроить анимированный gif в электронное письмо при его отправке, но тогда вы лишаетесь возможности получать последнюю информацию в анимации. (т. е. я могу не читать вашу электронную почту в течение недели, если изображение было встроено, это социальная новость недельной давности, если это внешний URL-адрес, я могу не нажимать «показать изображения»)
  2. Анимированные GIF-файлы используют палитру из 256 цветов, поэтому вы не можете делать фотографическую анимацию с фотографическим качеством. Этот вопрос, похоже, касается отображения в основном текстового контента с записью последних социальных взаимодействий (твитов/сообщений), так что все должно быть в порядке.

Предполагая, что эти условия подходят для вашего приложения, нам нужно выяснить, как создать анимированный GIF в вашем коде HttpHandler, который вы разместили в вопросе. Это не новая идея, нам не нужно заново изобретать велосипед. Здесь есть и другие сообщения о stackoverflow:

Ответ, получивший наибольшее количество голосов в первом сообщении stackoverflow, кажется мне вполне разумным: HOWTO: создание анимированного GIF с помощью .Net (C#)

Этот метод не зависит от каких-либо внешних библиотек и имеет некоторые комментарии, поясняющие различные поля заголовков. В вашем случае вас будет интересовать массив байтов buf3 в этом коде, который является заголовком для каждого кадра. Здесь вы можете установить задержку для каждого отображаемого изображения. Вы, вероятно, выиграете от быстрого поиска в Google спецификаций анимированных GIF, которые появятся:

Спецификации позволят вам точно определить, что делает каждое поле заголовка. Если у вас нет желания изучать заголовки в GIF, то, возможно, просто вернитесь к чьей-то реализации, например: Кодировщик NGif в CodeProject. Конечно, у вас всегда будет больше контроля над процессом, если у вас есть более глубокое понимание того, как он работает. Даже если вы используете чужую реализацию, полезно понимать, что она делает за кулисами.

person BenSwayne    schedule 20.11.2011
comment
Спасибо за ваш очень четкий ответ. Но, к сожалению, нам придется создавать отдачу, когда пользователь открывает почту, а затем всегда показывать старые твиты в формате gif. Но мы хотим показывать живые твиты. Сейчас пробуем MJPEG. Как вы думаете, это сработает? - person Vinzcent; 21.11.2011
comment
@Vinzcent Я не думаю, что ты полностью понял. В теле письма вы можете либо сделать ссылку на внешний GIF-файл по своему собственному URL-адресу в Интернете, либо встроить GIF-файл в электронное письмо. Только встроенный будет старым, внешний URL будет активным. Но некоторые программы для работы с электронной почтой блокируют внешние ссылки, поэтому ваш пользователь должен щелкнуть, чтобы увидеть изображение. В ОБОИХ СЛУЧАЯХ вы используете изображение GIF, это просто метод, который вы используете, чтобы включить его в свое электронное письмо, который изменит результаты. MJPEG ничем не отличается, но, возможно, немного хуже из-за количества почтовых клиентов, которые его просто не поддерживают. - person BenSwayne; 21.11.2011

Для этого вы можете использовать анимацию CSS 3, см. http://www.1stwebdesigner.com/css/50-awesome-css3-animations/ для некоторых примеров.

Я сам не использовал CSS 3, но видел, как мои коллеги делают с ним классные штуки.

person Ivo    schedule 18.11.2011
comment
Мой реальный образ немного сложнее, чем просто часы, которые я использую в этом примере :) - person Vinzcent; 18.11.2011
comment
Если вы собираетесь полагаться на CSS3, почему бы просто не использовать JavaScript? У любого, у кого есть современный обновленный браузер, JavaScript либо работает, либо намеренно отключен, потому что они знают, что он делает, и что он им не нужен, и могут снова включить его, если увидят необходимость при доступе к вашему сайту. - person BenSwayne; 20.11.2011
comment
Теперь, когда я прочитал некоторые разъяснения ниже от оригинального плаката, кажется, что это для электронной почты, и в этом случае и CSS3, и JavaScript не могут быть и речи. Подумайте о скольких почтовых клиентах 3-5 лет (вспомните смартфоны, которым 3 года) плюс люди, использующие веб-почту в старых браузерах (например, пользователь Gmail в IE6). - person BenSwayne; 20.11.2011

Вы не можете просто создать анимированный gif? Я не знаю, откуда берутся ваши изображения, но мне это кажется самым простым решением.

В противном случае вы можете создать службу, которая запускается каждые 2 секунды на вашем сервере, но я не уверен, как вы сможете подключить ее к своему сайту.

person simonlchilds    schedule 18.11.2011
comment
Нет, содержимое изображения не предопределено. Он содержит, например, список твитов :). - person Vinzcent; 18.11.2011
comment
О, хорошо. Могу я спросить, почему вы не можете использовать javascript? - person simonlchilds; 18.11.2011
comment
Справедливая дремота. Почтовые клиенты не смогут получить доступ к вашему серверу для запуска кода, или я ошибся? - person simonlchilds; 19.11.2011
comment
Создание службы на вашем сервере может позволить вам перезаписывать файл изображения (на сервере) каждые несколько секунд, но это не заставит клиента обновлять свою копию. - person BenSwayne; 20.11.2011