/// <summary> /// Returns the .NET color that matches an element's background color. /// </summary> /// <param name="element"></param> /// <param name="detectImage"> /// Takes background-image into account when looking for background color. /// This is positionally sensitive so if you're not sure if your elements /// are in the "correct" positions relative to each other (such as in /// Web Layout view) you may want to set this to false. /// </param> /// <param name="pageUrl">The URL that should be used to escape relative background image paths. Can be null.</param> /// <param name="defaultColor"></param> /// <returns></returns> public static Color GetBackgroundColor(IHTMLElement element, bool detectImage, string pageUrl, Color defaultColor) { Rectangle childBounds = new Rectangle(HTMLElementHelper.CalculateOffset(element), new Size(element.offsetWidth, element.offsetHeight)); while (element != null) { IHTMLCurrentStyle style = ((IHTMLElement2)element).currentStyle; string colorStr = style.backgroundColor as string; if (!string.IsNullOrEmpty(colorStr) && colorStr != "transparent") { if (colorStr == "inherit") { detectImage = false; } else { return(GetColorFromHexColor(ParseColorToHex(colorStr), defaultColor)); } } string imageUrl = style.backgroundImage; if (detectImage && !string.IsNullOrEmpty(imageUrl) && imageUrl != "none" && (style.backgroundRepeat == "repeat" || style.backgroundRepeat == "repeat-y")) { StyleUrl styleUrl = new CssParser(imageUrl.Trim()).Next() as StyleUrl; Trace.Assert(styleUrl != null, "Style URL could not be parsed"); if (styleUrl != null) { // If there's a background image URL... string url = styleUrl.LiteralText; using (Stream imageStream = GetStreamForUrl(url, pageUrl, element)) { if (imageStream != null) { // ...and we were able to open/download it... using (Image image = Image.FromStream(imageStream)) { if (image is Bitmap) { // ...and it's a Bitmap, then use it to get the color. Rectangle containerBounds = new Rectangle(HTMLElementHelper.CalculateOffset(element), new Size(element.offsetWidth, element.offsetHeight)); Color color = GetColorFromBackgroundImage((Bitmap)image, childBounds, containerBounds, style); // We can't use semi-transparent backgrounds, keep looking if (color.A == 255) { return(color); } } } } } } } element = element.parentElement; } return(defaultColor); }