public IInnerTransform FromComposite(OpenXmlCompositeElement sdkCompositeElement)
        {
            IInnerTransform innerTransform;
            var             t2d = sdkCompositeElement.Descendants <A.Transform2D>().FirstOrDefault();

            if (t2d != null)
            {
                // Group
                if (sdkCompositeElement.Parent is P.GroupShape groupShape)
                {
                    innerTransform = new NonPlaceholderGroupedTransform(sdkCompositeElement, groupShape);
                }
                // ShapeTree
                else
                {
                    innerTransform = new NonPlaceholderTransform(sdkCompositeElement);
                }
            }
            else
            {
                var placeholderLocationData = _phService.TryGet(sdkCompositeElement);
                innerTransform = new PlaceholderTransform(placeholderLocationData);
            }

            return(innerTransform);
        }
Beispiel #2
0
        /// <summary>
        /// Gets
        /// </summary>
        /// <param name="sdkCompositeElement"></param>
        /// <returns></returns>
        public ILocation FromComposite(OpenXmlCompositeElement sdkCompositeElement)
        {
            Check.NotNull(sdkCompositeElement, nameof(sdkCompositeElement));

            ILocation innerTransform;
            var       aTransform = sdkCompositeElement.Descendants <A.Transform2D>().FirstOrDefault();

            if (aTransform != null ||
                sdkCompositeElement.Descendants <P.Transform>().FirstOrDefault() != null)   // p:graphicFrame contains p:xfrm
            {
                // Group
                if (sdkCompositeElement.Parent is P.GroupShape groupShape)
                {
                    innerTransform = new NonPlaceholderGroupedTransform(sdkCompositeElement, groupShape);
                }
                // ShapeTree
                else
                {
                    innerTransform = new NonPlaceholderTransform(sdkCompositeElement);
                }
            }
            else
            {
                var placeholderLocationData = _phService.TryGetLocation(sdkCompositeElement);
                innerTransform = new PlaceholderTransform(placeholderLocationData);
            }

            return(innerTransform);
        }
        // Add image generation logic here and return an instance of ImageInfo
        public override ImageInfo GenerateImage(NameValueCollection parameters)
        {
            this.SetupCulture();

            // which type of image should be generated ?
            string mode = string.IsNullOrEmpty(parameters["mode"]) ? "profilepic" : parameters["mode"].ToLowerInvariant();

            // We need to determine the output format
            string format = string.IsNullOrEmpty(parameters["format"]) ? "jpg" : parameters["format"].ToLowerInvariant();

            // Lets retrieve the color
            Color color     = string.IsNullOrEmpty(parameters["color"]) ? Color.White : (parameters["color"].StartsWith("#") ? ColorTranslator.FromHtml(parameters["color"]) : Color.FromName(parameters["color"]));
            Color backColor = string.IsNullOrEmpty(parameters["backcolor"]) ? Color.White : (parameters["backcolor"].StartsWith("#") ? ColorTranslator.FromHtml(parameters["backcolor"]) : Color.FromName(parameters["backcolor"]));

            // Do we have a border ?
            int border = string.IsNullOrEmpty(parameters["border"]) ? 0 : Convert.ToInt32(parameters["border"]);

            // Do we have a resizemode defined ?
            var resizeMode = string.IsNullOrEmpty(parameters["resizemode"]) ? ImageResizeMode.Fit : (ImageResizeMode)Enum.Parse(typeof(ImageResizeMode), parameters["ResizeMode"], true);

            // Maximum sizes
            int maxWidth  = string.IsNullOrEmpty(parameters["MaxWidth"]) ? 0 : Convert.ToInt32(parameters["MaxWidth"]);
            int maxHeight = string.IsNullOrEmpty(parameters["MaxHeight"]) ? 0 : Convert.ToInt32(parameters["MaxHeight"]);

            // Any text ?
            string text = string.IsNullOrEmpty(parameters["text"]) ? string.Empty : parameters["text"];

            // Default Image
            this._defaultImageFile = string.IsNullOrEmpty(parameters["NoImage"]) ? string.Empty : parameters["NoImage"];

            // Do we override caching for this image ?
            if (!string.IsNullOrEmpty(parameters["NoCache"]))
            {
                this.EnableClientCache = false;
                this.EnableServerCache = false;
            }

            try
            {
                this.ContentType = GetImageFormat(format);

                switch (mode)
                {
                case "profilepic":
                    int uid;
                    if (!int.TryParse(parameters["userid"], out uid) || uid <= 0)
                    {
                        uid = -1;
                    }

                    var uppTrans = new UserProfilePicTransform
                    {
                        UserID = uid,
                    };

                    IFileInfo photoFile;
                    this.ContentType = !uppTrans.TryGetPhotoFile(out photoFile)
                            ? ImageFormat.Gif
                            : GetImageFormat(photoFile?.Extension ?? "jpg");

                    this.ImageTransforms.Add(uppTrans);
                    break;

                case "placeholder":
                    var placeHolderTrans = new PlaceholderTransform();
                    int width, height;
                    if (TryParseDimension(parameters["w"], out width))
                    {
                        placeHolderTrans.Width = width;
                    }

                    if (TryParseDimension(parameters["h"], out height))
                    {
                        placeHolderTrans.Height = height;
                    }

                    if (!string.IsNullOrEmpty(parameters["Color"]))
                    {
                        placeHolderTrans.Color = color;
                    }

                    if (!string.IsNullOrEmpty(parameters["Text"]))
                    {
                        placeHolderTrans.Text = text;
                    }

                    if (!string.IsNullOrEmpty(parameters["BackColor"]))
                    {
                        placeHolderTrans.BackColor = backColor;
                    }

                    this.ImageTransforms.Add(placeHolderTrans);
                    break;

                case "securefile":
                    var secureFileTrans = new SecureFileTransform();
                    if (!string.IsNullOrEmpty(parameters["FileId"]))
                    {
                        var fileId = Convert.ToInt32(parameters["FileId"]);
                        var file   = FileManager.Instance.GetFile(fileId);
                        if (file == null)
                        {
                            return(this.GetEmptyImageInfo());
                        }

                        var folder = FolderManager.Instance.GetFolder(file.FolderId);
                        if (!secureFileTrans.DoesHaveReadFolderPermission(folder))
                        {
                            return(this.GetEmptyImageInfo());
                        }

                        this.ContentType           = GetImageFormat(file.Extension);
                        secureFileTrans.SecureFile = file;
                        secureFileTrans.EmptyImage = this.EmptyImage;
                        this.ImageTransforms.Add(secureFileTrans);
                    }

                    break;

                case "file":
                    var imgFile = string.Empty;
                    var imgUrl  = string.Empty;

                    // Lets determine the 2 types of Image Source: Single file, file url
                    var filePath = parameters["File"];
                    if (!string.IsNullOrEmpty(filePath))
                    {
                        filePath = filePath.Trim();
                        var fullFilePath = HttpContext.Current.Server.MapPath(filePath);
                        if (!File.Exists(fullFilePath) || !IsAllowedFilePathImage(filePath))
                        {
                            return(this.GetEmptyImageInfo());
                        }

                        imgFile = fullFilePath;
                    }
                    else if (!string.IsNullOrEmpty(parameters["Url"]))
                    {
                        var url = parameters["Url"];

                        // allow only site resources when using the url parameter
                        if (!url.StartsWith("http") || !UriBelongsToSite(new Uri(url)))
                        {
                            return(this.GetEmptyImageInfo());
                        }

                        imgUrl = url;
                    }

                    if (string.IsNullOrEmpty(parameters["format"]))
                    {
                        string extension;
                        if (string.IsNullOrEmpty(parameters["Url"]))
                        {
                            var fi = new System.IO.FileInfo(imgFile);
                            extension = fi.Extension.ToLowerInvariant();
                        }
                        else
                        {
                            string[] parts = parameters["Url"].Split('.');
                            extension = parts[parts.Length - 1].ToLowerInvariant();
                        }

                        this.ContentType = GetImageFormat(extension);
                    }

                    var imageFileTrans = new ImageFileTransform {
                        ImageFilePath = imgFile, ImageUrl = imgUrl
                    };
                    this.ImageTransforms.Add(imageFileTrans);
                    break;

                default:

                    string   imageTransformClass      = ConfigurationManager.AppSettings["DnnImageHandler." + mode];
                    string[] imageTransformClassParts = imageTransformClass.Split(',');
                    var      asm = Assembly.LoadFrom(Globals.ApplicationMapPath + @"\bin\" +
                                                     imageTransformClassParts[1].Trim() + ".dll");
                    var t = asm.GetType(imageTransformClassParts[0].Trim());
                    var imageTransform = (ImageTransform)Activator.CreateInstance(t);

                    foreach (var key in parameters.AllKeys)
                    {
                        var pi = t.GetProperty(key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                        if (pi != null && key != "mode")
                        {
                            switch (key.ToLowerInvariant())
                            {
                            case "color":
                                pi.SetValue(imageTransform, color, null);
                                break;

                            case "backcolor":
                                pi.SetValue(imageTransform, backColor, null);
                                break;

                            case "border":
                                pi.SetValue(imageTransform, border, null);
                                break;

                            default:
                                switch (pi.PropertyType.Name)
                                {
                                case "Int32":
                                    pi.SetValue(imageTransform, Convert.ToInt32(parameters[key]), null);
                                    break;

                                case "String":
                                    pi.SetValue(imageTransform, parameters[key], null);
                                    break;
                                }

                                break;
                            }
                        }
                    }

                    this.ImageTransforms.Add(imageTransform);
                    break;
                }
            }
            catch (Exception ex)
            {
                Exceptions.Exceptions.LogException(ex);
                return(this.GetEmptyImageInfo());
            }

            // Resize-Transformation
            if (mode != "placeholder")
            {
                int width, height;

                TryParseDimension(parameters["w"], out width);
                TryParseDimension(parameters["h"], out height);

                var size = string.IsNullOrEmpty(parameters["size"]) ? string.Empty : parameters["size"];

                switch (size)
                {
                case "xxs":
                    width  = 16;
                    height = 16;
                    break;

                case "xs":
                    width  = 32;
                    height = 32;
                    break;

                case "s":
                    width  = 50;
                    height = 50;
                    break;

                case "l":
                    width  = 64;
                    height = 64;
                    break;

                case "xl":
                    width  = 128;
                    height = 128;
                    break;

                case "xxl":
                    width  = 256;
                    height = 256;
                    break;
                }

                if (mode == "profilepic")
                {
                    resizeMode = ImageResizeMode.FitSquare;
                    if (width > 0 && height > 0 && width != height)
                    {
                        resizeMode = ImageResizeMode.Fill;
                    }
                }

                if (width > 0 || height > 0)
                {
                    var resizeTrans = new ImageResizeTransform
                    {
                        Mode      = resizeMode,
                        BackColor = backColor,
                        Width     = width,
                        Height    = height,
                        MaxWidth  = maxWidth,
                        MaxHeight = maxHeight,
                        Border    = border,
                    };
                    this.ImageTransforms.Add(resizeTrans);
                }
            }

            // Gamma adjustment
            if (!string.IsNullOrEmpty(parameters["Gamma"]))
            {
                var    gammaTrans = new ImageGammaTransform();
                double gamma;
                if (double.TryParse(parameters["Gamma"], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out gamma) && gamma >= 0.2 && gamma <= 5)
                {
                    gammaTrans.Gamma = gamma;
                    this.ImageTransforms.Add(gammaTrans);
                }
            }

            // Brightness adjustment
            if (!string.IsNullOrEmpty(parameters["Brightness"]))
            {
                var brightnessTrans = new ImageBrightnessTransform();
                int brightness;
                if (int.TryParse(parameters["Brightness"], out brightness))
                {
                    brightnessTrans.Brightness = brightness;
                    this.ImageTransforms.Add(brightnessTrans);
                }
            }

            // Contrast adjustment
            if (!string.IsNullOrEmpty(parameters["Contrast"]))
            {
                var    contrastTrans = new ImageContrastTransform();
                double contrast;
                if (double.TryParse(parameters["Contrast"], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out contrast) && (contrast >= -100 && contrast <= 100))
                {
                    contrastTrans.Contrast = contrast;
                    this.ImageTransforms.Add(contrastTrans);
                }
            }

            // Greyscale
            if (!string.IsNullOrEmpty(parameters["Greyscale"]))
            {
                var greyscaleTrans = new ImageGreyScaleTransform();
                this.ImageTransforms.Add(greyscaleTrans);
            }

            // Invert
            if (!string.IsNullOrEmpty(parameters["Invert"]))
            {
                var invertTrans = new ImageInvertTransform();
                this.ImageTransforms.Add(invertTrans);
            }

            // Rotate / Flip
            if (!string.IsNullOrEmpty(parameters["RotateFlip"]))
            {
                var rotateFlipTrans = new ImageRotateFlipTransform();
                var rotateFlipType  = (RotateFlipType)Enum.Parse(typeof(RotateFlipType), parameters["RotateFlip"]);
                rotateFlipTrans.RotateFlip = rotateFlipType;
                this.ImageTransforms.Add(rotateFlipTrans);
            }

            // We start the chain with an empty image
            var dummy = new Bitmap(1, 1);

            using (var ms = new MemoryStream())
            {
                dummy.Save(ms, this.ContentType);
                return(new ImageInfo(ms.ToArray()));
            }
        }