private ImageSource GetBitmap(SvgImageElement element, WpfDrawingContext context)
        {
            if (element.IsSvgImage)
            {
                return(null);
            }

            if (element.Href == null)
            {
                return(null);
            }

            if (!element.Href.AnimVal.StartsWith("data:", StringComparison.OrdinalIgnoreCase))
            {
                SvgUriReference svgUri      = element.UriReference;
                string          absoluteUri = svgUri.AbsoluteUri;
                if (string.IsNullOrWhiteSpace(absoluteUri))
                {
                    return(null); // most likely, the image does not exist...
                }
                if (absoluteUri.StartsWith("#", StringComparison.OrdinalIgnoreCase))
                {
                    Trace.WriteLine("Uri: " + absoluteUri); // image elements can't reference elements in an svg file
                    return(null);
                }

                Uri imageUri = new Uri(svgUri.AbsoluteUri);
                if (imageUri.IsFile)
                {
                    if (File.Exists(imageUri.LocalPath))
                    {
                        BitmapImage imageSource = new BitmapImage();

                        imageSource.BeginInit();
                        imageSource.CacheOption   = BitmapCacheOption.OnLoad;
                        imageSource.CreateOptions = BitmapCreateOptions.IgnoreImageCache
                                                    | BitmapCreateOptions.PreservePixelFormat;
                        imageSource.UriSource = imageUri;
                        imageSource.EndInit();

//                        imageSource.Freeze();

                        return(imageSource);
                    }

                    return(null);
                }
                else
                {
                    Stream stream = svgUri.ReferencedResource.GetResponseStream();

                    BitmapImage imageSource = new BitmapImage();
                    imageSource.BeginInit();
                    imageSource.CacheOption   = BitmapCacheOption.OnLoad;
                    imageSource.CreateOptions = BitmapCreateOptions.IgnoreImageCache
                                                | BitmapCreateOptions.PreservePixelFormat;
                    imageSource.StreamSource = stream;
                    imageSource.EndInit();

//                    imageSource.Freeze();

                    return(imageSource);
                }
            }
            else
            {
                WpfEmbeddedImageVisitor imageVisitor = context.ImageVisitor;
                if (imageVisitor != null)
                {
                    ImageSource visitorSource = imageVisitor.Visit(element, context);
                    if (visitorSource != null)
                    {
                        return(visitorSource);
                    }
                }

                string sURI       = element.Href.AnimVal.Replace(" ", "");
                int    nColon     = sURI.IndexOf(":", StringComparison.OrdinalIgnoreCase);
                int    nSemiColon = sURI.IndexOf(";", StringComparison.OrdinalIgnoreCase);
                int    nComma     = sURI.IndexOf(",", StringComparison.OrdinalIgnoreCase);

                string sMimeType = sURI.Substring(nColon + 1, nSemiColon - nColon - 1);

                string sContent = sURI.Substring(nComma + 1);
                byte[] bResult  = Convert.FromBase64CharArray(sContent.ToCharArray(),
                                                              0, sContent.Length);

                BitmapImage imageSource = new BitmapImage();
                imageSource.BeginInit();
                imageSource.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                imageSource.StreamSource  = new MemoryStream(bResult);
                imageSource.EndInit();

//                imageSource.Freeze();

                return(imageSource);
            }
        }
Beispiel #2
0
        private BitmapSource GetBitmap(SvgImageElement element, WpfDrawingContext context)
        {
            if (element.IsSvgImage)
            {
                return(null);
            }

            if (!element.Href.AnimVal.StartsWith("data:"))
            {
                SvgUriReference svgUri      = element.UriReference;
                string          absoluteUri = svgUri.AbsoluteUri;
                if (String.IsNullOrEmpty(absoluteUri))
                {
                    return(null); // most likely, the image does not exist...
                }

                Uri imageUri = new Uri(svgUri.AbsoluteUri);
                if (imageUri.IsFile)
                {
                    if (File.Exists(imageUri.LocalPath))
                    {
                        BitmapImage imageSource = new BitmapImage();

                        imageSource.BeginInit();
                        imageSource.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                        imageSource.UriSource     = imageUri;
                        imageSource.EndInit();

                        return(imageSource);
                    }

                    return(null);
                }
                else
                {
                    Stream stream = svgUri.ReferencedResource.GetResponseStream();

                    BitmapImage imageSource = new BitmapImage();
                    imageSource.BeginInit();
                    imageSource.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                    imageSource.StreamSource  = stream;
                    imageSource.EndInit();

                    return(imageSource);
                }
            }
            else
            {
                WpfEmbeddedImageVisitor imageVisitor = context.ImageVisitor;
                if (imageVisitor != null)
                {
                    BitmapSource visitorSource = imageVisitor.Visit(element, context);
                    if (visitorSource != null)
                    {
                        return(visitorSource);
                    }
                }

                string sURI       = element.Href.AnimVal;
                int    nColon     = sURI.IndexOf(":");
                int    nSemiColon = sURI.IndexOf(";");
                int    nComma     = sURI.IndexOf(",");

                string sMimeType = sURI.Substring(nColon + 1, nSemiColon - nColon - 1);

                string sContent = sURI.Substring(nComma + 1);
                byte[] bResult  = Convert.FromBase64CharArray(sContent.ToCharArray(),
                                                              0, sContent.Length);

                BitmapImage imageSource = new BitmapImage();
                imageSource.BeginInit();
                imageSource.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                imageSource.StreamSource  = new MemoryStream(bResult);
                imageSource.EndInit();

                return(imageSource);
            }
        }