예제 #1
0
        /// <summary>
        /// Attach an image
        /// </summary>
        /// <param name="originalImage">Image to upload,  null if it would be only a reference</param>
        /// <param name="actions">List of <see cref="ImageAction"/></param>
        /// <param name="predicate">Ontology predicate</param>
        /// <param name="mainImage">True if the image is the resource main image</param>
        /// <param name="imageId">Image identifier. If it's Guid.Empty, it would be automatically generated</param>
        /// <param name="onlyReference">True if the image mustn't be saved, only as a reference</param>
        /// <param name="entity">(Optional) The auxiliary entity that owns the image property</param>
        /// <param name="extension">Image extension</param>
        /// <param name="saveOriginalImage">True if the original file must be saved</param>
        /// <param name="saveMaxSizedImage">True if the max sized image must be saved</param>
        /// <param name="saveMainImage">True if the main image must be saved</param>
        /// <returns>True if the image reference has been attached successfully</returns>
        private bool AttachImageInternal(byte[] originalImage, List <ImageAction> actions, string predicate, bool mainImage, Guid imageId, bool onlyReference, OntologyEntity entity, string extension, bool saveOriginalImage = true, bool saveMaxSizedImage = false, bool saveMainImage = true)
        {
            if (string.IsNullOrEmpty(extension))
            {
                extension = ".jpg";
            }
            else
            {
                if (!extension.StartsWith("."))
                {
                    extension = "." + extension;
                }
            }

            if (imageId.Equals(Guid.Empty))
            {
                imageId = Guid.NewGuid();
            }

            bool attachedImage = false;

            try
            {
                List <string> errorList = new List <string>();

                if (actions == null)
                {
                    // Without actions
                    if (mainImage && saveOriginalImage)
                    {
                        // The image to upload has lower size than 240 pixels. The image quality would be 100%
                        MainImage = string.Format("[IMGPrincipal][240,]{0}" + extension, imageId);

                        AttachedFilesName.Add($"{imageId}" + extension);
                        AttachedFilesType.Add(AttachedResourceFilePropertyTypes.image);

                        AttachedFilesName.Add($"{imageId}_240" + extension);
                        AttachedFilesType.Add(AttachedResourceFilePropertyTypes.image);

                        if (!onlyReference)
                        {
                            AttachedFiles.Add(originalImage);
                            AttachedFiles.Add(originalImage);
                            AttachedFiles.Add(originalImage);
                        }
                        attachedImage = true;
                    }
                    else if (saveOriginalImage)
                    {
                        AttachedFilesName.Add($"{imageId}" + extension);
                        AttachedFilesType.Add(AttachedResourceFilePropertyTypes.image);

                        if (!onlyReference)
                        {
                            AttachedFiles.Add(originalImage);
                        }
                        attachedImage = true;
                    }
                    else
                    {
                        throw new GnossAPIException("Actions can be null only when the image is a main image and the original image is set to be saved");
                    }
                }
                else
                {
                    // With actions

                    bool   originalImageSaved     = false;
                    Bitmap maxSizeImage           = null;
                    bool   imageModificationError = false;

                    foreach (ImageAction action in actions)
                    {
                        imageModificationError = false;
                        Bitmap resizedImage = null;

                        if (!onlyReference)
                        {
                            // Modify the image
                            switch (action.ImageTransformationType)
                            {
                            case ImageTransformationType.Crop:
                                try
                                {
                                    resizedImage = ImageHelper.CropImageToSquare(ImageHelper.ByteArrayToBitmap(originalImage), action.Size);
                                }
                                catch (GnossAPIException gaex)
                                {
                                    imageModificationError = true;
                                    errorList.Add(gaex.Message);
                                }
                                break;

                            case ImageTransformationType.ResizeToHeight:
                                try
                                {
                                    resizedImage = ImageHelper.ResizeImageToHeight(ImageHelper.ByteArrayToBitmap(originalImage), action.Height);
                                }
                                catch (GnossAPIException gaex)
                                {
                                    imageModificationError = true;
                                    errorList.Add(gaex.Message);
                                }
                                break;

                            case ImageTransformationType.ResizeToWidth:
                                try
                                {
                                    resizedImage = ImageHelper.ResizeImageToWidth(ImageHelper.ByteArrayToBitmap(originalImage), action.Width);
                                }
                                catch (GnossAPIException gaex)
                                {
                                    imageModificationError = true;
                                    errorList.Add(gaex.Message);
                                }
                                break;

                            case ImageTransformationType.ResizeToHeightAndWidth:
                                try
                                {
                                    resizedImage = ImageHelper.ResizeImageToHeightAndWidth(ImageHelper.ByteArrayToBitmap(originalImage), action.Width, action.Height);
                                }
                                catch (GnossAPIException gaex)
                                {
                                    imageModificationError = true;
                                    errorList.Add(gaex.Message);
                                }
                                break;

                            case ImageTransformationType.CropToHeightAndWidth:
                                try
                                {
                                    resizedImage = ImageHelper.CropImageToHeightAndWidth(ImageHelper.ByteArrayToBitmap(originalImage), action.Height, action.Width);
                                }
                                catch (GnossAPIException gaex)
                                {
                                    imageModificationError = true;
                                    errorList.Add(gaex.Message);
                                }
                                break;

                            default:
                                throw new GnossAPIException("The ImageTransformationType is not valid");
                            }
                        }

                        if (mainImage && imageModificationError)
                        {
                            mainImage = false;
                        }

                        if (!imageModificationError && !onlyReference)
                        {
                            if (mainImage)
                            {
                                MainImage = string.Format("[IMGPrincipal][{0},]{1}" + extension, action.Size, imageId);
                                mainImage = false;
                            }

                            AttachedFilesName.Add($"{imageId}_{action.Size}" + extension);
                            AttachedFiles.Add(ImageHelper.BitmapToByteArray(resizedImage, action.ImageQualityPercentage));
                            AttachedFilesType.Add(AttachedResourceFilePropertyTypes.image);
                            attachedImage = true;

                            if (action.EmbedsRGB)
                            {
                                resizedImage = ImageHelper.AssignEXIFPropertyColorSpaceSRGB(resizedImage);
                            }

                            // Save original image
                            if (saveOriginalImage && !originalImageSaved)
                            {
                                if (saveMainImage)
                                {
                                    AttachedFilesName.Add($"{imageId}" + extension);
                                    AttachedFiles.Add(ImageHelper.BitmapToByteArray(ImageHelper.ByteArrayToBitmap(originalImage), actions.Max(z => z.ImageQualityPercentage)));
                                    AttachedFilesType.Add(AttachedResourceFilePropertyTypes.image);
                                }

                                originalImageSaved = true;
                                attachedImage      = true;
                            }
                        }
                        else
                        {
                            if (mainImage)
                            {
                                MainImage = string.Format("[IMGPrincipal][{0},]{1}" + extension, action.Size, imageId);
                                mainImage = false;
                            }
                            attachedImage = true;
                        }
                    }

                    // Save the image at the max size allowed
                    if (saveMaxSizedImage)
                    {
                        try
                        {
                            // The quality percentage of the max size image is the highest quality percentage
                            if (ImageHelper.ByteArrayToBitmap(originalImage).Width > Constants.MAXIMUM_WIDTH_GNOSS_IMAGE)
                            {
                                maxSizeImage = ImageHelper.ResizeImageToWidth(ImageHelper.ByteArrayToBitmap(originalImage), Constants.MAXIMUM_WIDTH_GNOSS_IMAGE);

                                AttachedFilesName.Add($"{imageId}_{Constants.MAXIMUM_WIDTH_GNOSS_IMAGE}" + extension);
                                AttachedFiles.Add(ImageHelper.BitmapToByteArray(maxSizeImage, actions.Max(z => z.ImageQualityPercentage)));
                                AttachedFilesType.Add(AttachedResourceFilePropertyTypes.image);

                                attachedImage = true;
                            }
                            else
                            {
                                AttachedFilesName.Add($"{imageId}_{Constants.MAXIMUM_WIDTH_GNOSS_IMAGE}" + extension);
                                AttachedFiles.Add(ImageHelper.BitmapToByteArray(ImageHelper.ByteArrayToBitmap(originalImage), actions.Max(z => z.ImageQualityPercentage)));
                                AttachedFilesType.Add(AttachedResourceFilePropertyTypes.image);

                                attachedImage = true;
                            }
                        }
                        catch (GnossAPIException gaex)
                        {
                            imageModificationError = true;
                            errorList.Add(gaex.Message);
                        }
                    }
                }

                if (entity != null && !string.IsNullOrWhiteSpace(predicate) && !string.IsNullOrEmpty(predicate))
                {
                    // The image is from an auxiliary entity
                    if (Ontology.Entities == null)
                    {
                        Ontology.Entities = new List <OntologyEntity>();
                        Ontology.Entities.Add(entity);
                    }

                    if (!onlyReference)
                    {
                        if (AttachedFiles.Count > 0 && AttachedFilesType.Count > 0)
                        {
                            if (entity.Properties == null)
                            {
                                entity.Properties = new List <OntologyProperty>();
                            }
                            entity.Properties.Add(new ImageOntologyProperty(predicate, $"{imageId}" + extension));
                        }
                    }
                    else
                    {
                        if (attachedImage)
                        {
                            if (entity.Properties == null)
                            {
                                entity.Properties = new List <OntologyProperty>();
                            }
                            entity.Properties.Add(new ImageOntologyProperty(predicate, $"{imageId}" + extension));
                        }
                    }
                }
                else
                {
                    // The image is an ontology property
                    if (!string.IsNullOrWhiteSpace(predicate) && !string.IsNullOrEmpty(predicate))
                    {
                        if (Ontology.Properties == null)
                        {
                            Ontology.Properties = new List <OntologyProperty>();
                        }

                        if (!onlyReference)
                        {
                            if (AttachedFilesType.Count > 0 && AttachedFiles.Count > 0)
                            {
                                ImageOntologyProperty pOntImg = new ImageOntologyProperty(predicate, $"{imageId}" + extension);
                                Ontology.Properties.Add(pOntImg);
                            }
                        }
                        else
                        {
                            if (attachedImage)
                            {
                                Ontology.Properties.Add(new ImageOntologyProperty(predicate, $"{imageId}" + extension));
                            }
                        }
                    }
                }

                if (errorList != null && errorList.Count > 0)
                {
                    string message = null;
                    foreach (string error in errorList)
                    {
                        if (message == null)
                        {
                            message = error;
                        }
                        else
                        {
                            message = $"{message}\n{error}";
                        }
                    }
                    throw new GnossAPIException(message);
                }
            }
            catch (GnossAPIException)
            {
                throw;
            }
            catch (FileNotFoundException ex)
            {
                throw new GnossAPIException($"The image: {imageId} doesn't exist or is inaccessible", ex);
            }

            _rdfFile = Ontology.GenerateRDF();
            return(attachedImage);
        }