<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>David Cilley's AJAX Imaging Blog : PNG</title><link>http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/PNG/default.aspx</link><description>Tags: PNG</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Non-Rectangular Masks on the Web: Part 1</title><link>http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx</link><pubDate>Fri, 04 Apr 2008 19:45:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:13610</guid><dc:creator>David Cilley</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/davidcilley/comments/13610.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/davidcilley/commentrss.aspx?PostID=13610</wfw:commentRss><description>&lt;p&gt;Over the past 15 or so years, I've edited and created a thousands of images.&amp;nbsp; I almost always use a mask for something, and it's very rarely only rectangular.&amp;nbsp;I have a need for doing this on the web, natively in the browser, and I might not be the only one.&lt;/p&gt;
&lt;p&gt;With JavaScript and the DOM, you can create a series rectangles that represent masks, but as the complexity of these masks go up, the number of DOM objects that need to be created go up.&amp;nbsp; This can make it slow to render, and slow to update.&lt;/p&gt;
&lt;p&gt;Most of the browsers used today show PNG images with an alpha channel(transparency) correctly.&lt;img src="http://www.atalasoft.com/cs/blogs/davidcilley/files/PNG_Mask.png" style="margin:4px;background-image:url(/cs/blogs/davidcilley/files/Hot_Air_Balloon_thumb.jpg);width:256px;height:256px;" align="right" height="256" width="256"&gt;&amp;nbsp;&amp;nbsp;PNG images with an&amp;nbsp;alpha channel can be used to mimic a client side mask by placing&amp;nbsp;them on top of the object that you want to mask.&amp;nbsp; The image to the right is one of these PNG images, with a JPG image behind it. There are three things you need to do to create a masking PNG image:&lt;br&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an image with a background color of your choice, at the size of the object you are masking.&lt;/li&gt;
&lt;li&gt;Make the areas you want&amp;nbsp;selected completely transparent on the alpha channel (Black).&lt;/li&gt;
&lt;li&gt;Make the rest of the image half transparent on the alpha channel (Gray).&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The remaining parts that you will need will be some JavaScript mouse events that allow you to drag a box on the object (something like a selection marquee), and a server side method that will create the PNG image described above.&lt;/p&gt;
&lt;p&gt;Since I have access to DotImage, I can use the WebAnnotationViewer and RemoteInvoke to do everything.&amp;nbsp; In my case I decided to use a ReferencedImage annotation to hold the alpha PNG. &amp;nbsp;Here's a basic run down of the concept, using DotImage:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use the WebAnnotationViewer's Selection box to select an area on the image, and attach a JavaScript event to&amp;nbsp;the Selection.Changed.&amp;nbsp; (MaskSelection In this example)&lt;/li&gt;
&lt;li&gt;In the Selection.Changed JavaScript event, use RemoteInvoke to run a&amp;nbsp;Page level server side method that creates the masked PNG image from the selection box. (Remote_MaskSelection in this example)&lt;/li&gt;
&lt;li&gt;The server side method keeps two images in the disk cache.&amp;nbsp; One for the masked areas drawn, and one for the transparent PNG that represents those masked areas.&lt;/li&gt;
&lt;li&gt;Every time the server side method is called it overwrites these images with the new data from&amp;nbsp;selection rectangle of the WebAnnotationViewer, effectively appending what was selected to the new mask.&lt;/li&gt;
&lt;li&gt;The mask image is an 8-bit&amp;nbsp;grayscale which starts out completely gray (color index 127) to indicate half transparent.&amp;nbsp; Areas that are selected are drawn onto this image as black (index 0).&lt;/li&gt;
&lt;li&gt;The alpha PNG image is a 32-bit RGBA image with a background color (red in this case), and a SetAlphaFromMaskCommand is used to put the mask image into the alpha channel of this new PNG&lt;/li&gt;
&lt;li&gt;The alpha PNG is then added to an annotation on the server side, and the client side JavaScript&amp;nbsp;is notified that it needs to update the annotation.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Here is the code I used to create the mask&amp;nbsp;image and the alpha PNG:&lt;/p&gt;
&lt;div style="padding:6px;"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;&lt;span style="color:black;"&gt;&amp;nbsp;private void SynchronizeMaskAnnotation(Size size)&lt;br&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;// This annotation was created on PageLoad, and is the only one on layer 0&lt;/span&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;AnnotationUI ann = this.WebAnnotationViewer1.Annotations.GetAnnotation(0, -1, 0);&lt;br&gt;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp;ReferencedImageAnnotation refAnn = ann as ReferencedImageAnnotation;&lt;br&gt;&amp;nbsp; &amp;nbsp;if (refAnn != null)&lt;br&gt;&amp;nbsp; &amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;refAnn.Size = size;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ReferencedImageData refAnnData = refAnn.Data as ReferencedImageData;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (refAnnData != null)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (refAnnData.ImageObject != null)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((Bitmap)refAnnData.ImageObject).Dispose();&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GC.Collect(); &lt;span&gt;// This is done because the .NET Bitmap class doesn't free the file in time for us to write over it&lt;/span&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt;&amp;nbsp; &amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;this.WebAnnotationViewer1.UpdateAnnotations();&lt;br&gt;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;private void AppendMask()&lt;br&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp;string _pathToCache = System.Configuration.ConfigurationManager.AppSettings["AtalasoftWebControls_Cache"];&lt;br&gt;&amp;nbsp; &amp;nbsp;string _prefix = Page.Session.SessionID + "_";&lt;br&gt;&amp;nbsp; &amp;nbsp;string _pathToMask = this._pathToCache + _prefix + "Mask.png";&lt;br&gt;&amp;nbsp; &amp;nbsp;string _pathToMaskAnn = this._pathToCache + _prefix + "MaskAnn.png";&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;AtalaImage maskImage = null;&lt;br&gt;&amp;nbsp; &amp;nbsp;AtalaImage alphaPNG = null;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;try&lt;br&gt;&amp;nbsp; &amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (File.Exists(Page.MapPath(_pathToMask)))&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;maskImage = new AtalaImage(Page.MapPath(_pathToMask));&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;maskImage = new AtalaImage(this.WebAnnotationViewer1.Image.Size.Width, this.WebAnnotationViewer1.Image.Size.Height, PixelFormat.Pixel8bppGrayscale, Color.Gray);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;alphaPNG = new AtalaImage(maskImage.Width, maskImage.Height, PixelFormat.Pixel32bppBgra, Color.Red);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Canvas maskCanvas = new Canvas(maskImage);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;maskCanvas.DrawRectangle(this.WebAnnotationViewer1.Selection.Rectangle, new SolidFill(Color.Black));&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;SetAlphaFromMaskCommand alpha = new SetAlphaFromMaskCommand(maskImage, false, AlphaMergeType.Replace);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ImageResults results = alpha.Apply(alphaPNG);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (alphaPNG != results.Image)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;alphaPNG.Dispose();&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;alphaPNG = results.Image;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;SynchronizeMaskAnnotation(alphaPNG.Size);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;maskImage.Save(Page.MapPath(_pathToMask), new PngEncoder(), null);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;alphaPNG.Save(Page.MapPath(_pathToMaskAnn), new PngEncoder(), null);&lt;br&gt;&amp;nbsp; &amp;nbsp;}&lt;br&gt;&amp;nbsp; &amp;nbsp;finally&lt;br&gt;&amp;nbsp; &amp;nbsp;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (maskImage != null)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;maskImage.Dispose();&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (alphaPNG != null)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;alphaPNG.Dispose();&lt;br&gt;&amp;nbsp; &amp;nbsp;}&lt;br&gt;&amp;nbsp;} &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx&amp;amp;;subject=Non-Rectangular+Masks+on+the+Web%3a+Part+1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx&amp;amp;;title=Non-Rectangular+Masks+on+the+Web%3a+Part+1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx&amp;amp;title=Non-Rectangular+Masks+on+the+Web%3a+Part+1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx&amp;amp;;title=Non-Rectangular+Masks+on+the+Web%3a+Part+1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx&amp;amp;;title=Non-Rectangular+Masks+on+the+Web%3a+Part+1&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2008/04/04/non-rectangular-masks-on-the-web-part-1.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13610" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/PNG/default.aspx">PNG</category><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/Masking/default.aspx">Masking</category></item><item><title>IE7 DXImageTransform and PNG transparency problem</title><link>http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx</link><pubDate>Wed, 14 Mar 2007 14:35:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:11668</guid><dc:creator>David Cilley</dc:creator><slash:comments>2</slash:comments><comments>http://www.atalasoft.com/cs/blogs/davidcilley/comments/11668.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/davidcilley/commentrss.aspx?PostID=11668</wfw:commentRss><description>&lt;P&gt;Recently I was tasked with creating a spiffy demo for our new AJAX Annotations control and I ran across an interesting problem. For reference, I am creating a demo that looks and behaves much like the &lt;A class="" href="http://www.atalasoft.com/ajaxviewer/" target=_blank&gt;AJAX Multipage Tiff Demo&lt;/A&gt;, with all the transparent PNG goodness that we can now take advantage of in IE7.&lt;/P&gt;
&lt;P&gt;Since the default&amp;nbsp;doctype&amp;nbsp;in VS 2005&amp;nbsp;is XHTML 1.0 Transitional, I decided now is a good time for me see how easy or difficult&amp;nbsp;using this doctype can be.&amp;nbsp; Primarily I have been sticking to HTML 4.0, because it's a heck of a lot easier to get your nested tables fitting to percentage based height and width.&lt;/P&gt;
&lt;P&gt;Switching to this doctype caused a few minor problems, but the biggest one that I noticed was this:&lt;BR&gt;&lt;A href="http://www.atalasoft.com/cs/photos/cilleyimages/picture11670.aspx" target=_blank&gt;&lt;IMG src="http://www.atalasoft.com/cs/photos/cilleyimages/images/11670/original.aspx" border=0&gt;&lt;/A&gt;&lt;BR&gt;What you are seeing here is the bottom right corner of the image I am attempting to use like a modal dialog background (the demo mentioned above shows how this is used).&amp;nbsp; This image is originally 150x150 pixels, and has been stretched to fit the browser's available area.&lt;/P&gt;
&lt;P&gt;It's supposed to look like this:&lt;BR&gt;&lt;A href="http://www.atalasoft.com/cs/photos/cilleyimages/picture11669.aspx" target=_blank&gt;&lt;IMG src="http://www.atalasoft.com/cs/photos/cilleyimages/images/11669/original.aspx" border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;So now I bet you're wondering the same thing I was.&amp;nbsp; What am I doing wrong on the page that's causing this?&amp;nbsp; The first thing I thought, was the doctype change.&amp;nbsp; This didn't fix the problem.&amp;nbsp; Then I figured that I must be using the old IE transparent PNG hack that's I've covered in previous posts.&amp;nbsp; Nope, not using it in this app.&amp;nbsp; However, I did find a DXImageTransform&amp;nbsp;filter in one of the underlying IFrames.&amp;nbsp; Once I got rid of the DXImageTransform, the problem went away.&lt;/P&gt;
&lt;P&gt;In my tests,&amp;nbsp;regardless of doctype, this problem can show up if you are using any DXImageTransform filters on any object on any of the&amp;nbsp;frames currently loaded into the browser window.&amp;nbsp; It seems to show up less if the PNG images are not overlapping any other objects, although I haven't been able to pinpoint exactly which cases are ok.&lt;/P&gt;
&lt;P&gt;I have created a &lt;A class="" href="http://www.atalasoft.com/cs/blogs/davidcilley/files/IE7DXImageTransformPNG.html"&gt;test html page that demonstrates this problem&lt;/A&gt;.&amp;nbsp; When you first load the page, the PNG image shows up correctly.&amp;nbsp; Once you click one of the buttons (using IE7 and Windows XP) the PNG image becomes blurred on the bottom and the right of the image.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx&amp;amp;;subject=IE7+DXImageTransform+and+PNG+transparency+problem" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx&amp;amp;;title=IE7+DXImageTransform+and+PNG+transparency+problem" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx&amp;amp;title=IE7+DXImageTransform+and+PNG+transparency+problem" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx&amp;amp;;title=IE7+DXImageTransform+and+PNG+transparency+problem" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx&amp;amp;;title=IE7+DXImageTransform+and+PNG+transparency+problem&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2007/03/14/ie7-dximagetransform-and-png-transparency-problem.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=11668" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/PNG/default.aspx">PNG</category><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/Internet+Explorer/default.aspx">Internet Explorer</category></item><item><title>PNG Transparency in Internet Explorer Revisited</title><link>http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx</link><pubDate>Wed, 10 May 2006 19:09:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:10028</guid><dc:creator>David Cilley</dc:creator><slash:comments>3</slash:comments><comments>http://www.atalasoft.com/cs/blogs/davidcilley/comments/10028.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/davidcilley/commentrss.aspx?PostID=10028</wfw:commentRss><description>&lt;P&gt;There have been countless times where I have made user interfaces that were easily customizable&amp;nbsp;using style sheets.&amp;nbsp; Usually the graphics were generic enough so that you could change the colors without making it look too bad.&amp;nbsp; Then there are the interfaces with the drop shadows, overlays, and other semi-transparent areas which would cause headaches when trying to mimic in IE.&lt;/P&gt;
&lt;P&gt;Recently I was tasked with creating a slick looking AJAX demo app, and I do so much development in FireFox, I had forgotten that IE still doesn't handle the alpha channel well.&amp;nbsp; I had already created most of the graphics using png's with alpha transparency, and I didn't want to remake everything.&amp;nbsp; So I Googled around the net looking for a simple solution, but most solutions required using&amp;nbsp;extra event handlers for each image tag's onload, or something similar.&amp;nbsp; I'm somewhat lazy, and I don't want to have to add an attribute to all my image tags.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I tinkered around a bit, and found a relatively easy way to get it to work.&amp;nbsp;&amp;nbsp;The only thing you have to do is make sure that your png image tags&amp;nbsp;have the width and height attributes defined. &lt;/P&gt;
&lt;P&gt;Here's a solution I came up with:&lt;/P&gt;&lt;PRE&gt;window.onload = OnPageLoad;

function OnPageLoad(){
   if (document.all)
      fixPngs();
}

// Loops through all img tags
function fixPngs(){
   for (i = 0; i &amp;lt; document.images.length; i++){
      var s = document.images[i].src;
      if (s.indexOf('.png') &amp;gt; 0)  // Checks for the .png extension
         fixPng(s, document.images[i]);
   }
}

// u = url of the image
// o = image object
function fixPng(u, o){
   o.src = 'spacer.gif';  // Need to give it an image so we don't get the red x
   o.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + u + "', sizingMethod='scale')";
}
&lt;/PRE&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx&amp;amp;;subject=PNG+Transparency+in+Internet+Explorer+Revisited" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx&amp;amp;;title=PNG+Transparency+in+Internet+Explorer+Revisited" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx&amp;amp;title=PNG+Transparency+in+Internet+Explorer+Revisited" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx&amp;amp;;title=PNG+Transparency+in+Internet+Explorer+Revisited" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx&amp;amp;;title=PNG+Transparency+in+Internet+Explorer+Revisited&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/davidcilley/archive/2006/05/10/png-transparency-in-internet-explorer-revisited.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=10028" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/PNG/default.aspx">PNG</category><category domain="http://www.atalasoft.com/cs/blogs/davidcilley/archive/tags/Internet+Explorer/default.aspx">Internet Explorer</category></item></channel></rss>