using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; namespace DataUriImage { [DefaultProperty("Text")] [ToolboxData("<{0}:DataUriImage runat=server></{0}:DataUriImage>")] public class DataUriImage : WebControl { public string ImageUrl { get { object o = ViewState["ImageUrl"]; if (o == null) return string.Empty; return (string)o; } set { ViewState["ImageUrl"] = value; } } public ImageAlign ImageAlign { get { object o = ViewState["ImageAlign"]; if (o == null) return ImageAlign.NotSet; return (ImageAlign)o; } set { ViewState["ImageAlign"] = value; } } public string AlternateText { get { object o = ViewState["AlternateText"]; if (o == null) return string.Empty; return (string)o; } set { ViewState["AlternateText"] = value; } } public string DescriptionUrl { get { object o = ViewState["DescriptionUrl"]; if (o == null) return string.Empty; return (string)o; } set { ViewState["DescriptionUrl"] = value; } } [Browsable(false)] public override bool Enabled { get { return base.Enabled; } set { base.Enabled = value; } } [Browsable(false)] public override FontInfo Font { get { return base.Font; } } protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Img; } } protected override void AddAttributesToRender(HtmlTextWriter writer) { string data; base.AddAttributesToRender(writer); if (Page.Request.Browser.Browser.Contains("IE") && Convert.ToDouble(Page.Request.Browser.Version) >= 8) { using (FileStream fs = new FileStream(HttpContext.Current.Request.MapPath(ImageUrl), FileMode.Open, FileAccess.Read)) { byte[] buff = new byte[32768]; using (BinaryReader br = new BinaryReader(fs)) { int size = br.Read(buff, 0, 32768); MemoryStream ms = new MemoryStream(); try { ms.Write(buff, 0, size); data = Convert.ToBase64String(ms.GetBuffer()); if (data.Length > 32768) throw new Exception( "image is too large to embed as Data Uri."); } finally { ms.Dispose(); } } } if (ImageUrl.EndsWith(".bmp")) writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/bmp;base64, " + data); else if (ImageUrl.EndsWith(".jpg")) writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/jpg;base64, " + data); else if (ImageUrl.EndsWith(".png")) writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64, " + data); else if (ImageUrl.EndsWith(".gif")) writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/gif;base64, " + data); else throw new Exception("image not support."); } else writer.AddAttribute(HtmlTextWriterAttribute.Src, ResolveClientUrl(ImageUrl)); if (ImageAlign != ImageAlign.NotSet) writer.AddAttribute(HtmlTextWriterAttribute.Align, ImageAlign.ToString().ToLower()); if (AlternateText.Length > 0) writer.AddAttribute(HtmlTextWriterAttribute.Alt, AlternateText); if (DescriptionUrl.Length > 0) writer.AddAttribute(HtmlTextWriterAttribute.Longdesc, ResolveClientUrl(DescriptionUrl)); } } } |