Exemple #1
0
        public async Task <ImageShortInfo> DeleteOriginalImageMetadata(string imageId, string partitionKey)
        {
            _logger.LogDebug(MetadataRemoving, imageId, partitionKey);

            var metadata = await _metadataStorage.GetMetadata(new List <string> {
                imageId
            }, partitionKey, CancellationToken.None);

            if (metadata == null || !metadata.Any())
            {
                return(null);
            }

            var deletedMetadata = await _metadataStorage.RemoveMetadata(imageId, partitionKey, CancellationToken.None);

            if (!deletedMetadata)
            {
                return(null);
            }

            _logger.LogInformation(MetadataRemoved, imageId);
            var imageMetadata = metadata[0];

            return(new ImageShortInfo
            {
                ImageId = imageMetadata.Id,
                ImageName = imageMetadata.Name,
                ThumbnailNames = imageMetadata.Thumbnails != null
                    ? imageMetadata.Thumbnails.Select(x => x.Name).ToArray()
                    : new string[0]
            });
        }
        public async Task <ImagesSearchResult> Search(string[] imageIds, string partitionKey)
        {
            var imagesMetadata = await _metadataStorage.GetMetadata(imageIds, partitionKey, CancellationToken.None);

            ImagesSearchResult result = new ImagesSearchResult
            {
                Images = new List <ImageFullInfoWithThumbnails>(imagesMetadata.Count)
            };

            foreach (var imageMetadata in imagesMetadata)
            {
                var model = new ImageFullInfoWithThumbnails
                {
                    Id         = imageMetadata.Id,
                    Bytes      = imageMetadata.SizeBytes,
                    Hash       = imageMetadata.MD5Hash,
                    Height     = imageMetadata.Height,
                    Width      = imageMetadata.Width,
                    Tags       = imageMetadata.Tags ?? new Dictionary <string, string>(),
                    Url        = _blobStorage.GetImageUri(imageMetadata.Name, ImageSizeType.Original).ToString(),
                    DateAdded  = imageMetadata.DateAddedUtc,
                    MimeType   = imageMetadata.MimeType,
                    Thumbnails = new List <ImageInfo>()
                };

                //todo if an image was added a long time ago and there are not any thumbnails, it's worth sending a new event to generate them

                if (imageMetadata.Thumbnails != null)
                {
                    foreach (var thumbnail in imageMetadata.Thumbnails)
                    {
                        model.Thumbnails.Add(new ImageInfo
                        {
                            Id        = thumbnail.Id,
                            Bytes     = thumbnail.SizeBytes,
                            Hash      = thumbnail.MD5Hash,
                            Height    = thumbnail.Height,
                            Width     = thumbnail.Width,
                            DateAdded = thumbnail.DateAddedUtc,
                            MimeType  = thumbnail.MimeType,
                            Url       = _blobStorage.GetImageUri(thumbnail.Name, ImageSizeType.Thumbnail).ToString()
                        });
                    }
                }

                result.Images.Add(model);
            }

            _logger.LogInformation(FoundImages, result.Images.Count, imageIds.Length);

            return(result);
        }
Exemple #3
0
        public async Task <List <ImageThumbnailGeneratingResult> > GenerateThumbnails(string imageId, string partitionKey)
        {
            var imageMetadataList = await _metadataStorage.GetMetadata(new List <string> {
                imageId
            }, partitionKey, CancellationToken.None);

            if (imageMetadataList == null || !imageMetadataList.Any())
            {
                _logger.LogInformation(ImageNotFound, imageId);
                return(null);
            }

            var imageMetadata = imageMetadataList[0];

            imageMetadata.Thumbnails = new List <ImageThumbnail>();
            _logger.LogDebug(MetadataReceived, imageMetadata.Id, imageMetadata.Width, imageMetadata.Height);
            if (imageMetadata.Width <= _thumbnailTargetWidth.Last())
            {
                _logger.LogInformation(ImageSmallerThanTargetWidth, imageMetadata.Id, imageMetadata.Width);
                return(new List <ImageThumbnailGeneratingResult>(0));
            }

            using var originalImageStream = await _blobStorage.DownloadImage(imageMetadata.Name, ImageSizeType.Original, CancellationToken.None);

            _logger.LogDebug(ImageDownloaded, imageMetadata.Id);

            StorageImageType imageType     = imageMetadata.ImageType;
            string           mimeType      = imageMetadata.MimeType;
            string           fileExtension = imageMetadata.FileExtension;

            if (imageType == StorageImageType.BMP)
            {
                imageType     = StorageImageType.PNG;
                mimeType      = PngMimeType;
                fileExtension = PngFileExtension;
            }

            var imageStream = originalImageStream;

            foreach (var targetWidth in _thumbnailTargetWidth)
            {
                if (targetWidth >= imageMetadata.Width)
                {
                    continue;
                }

                var resizingResult = _imageResizing.Resize(imageStream, (ImageType)imageType, targetWidth);
                _logger.LogDebug(ImageResized, imageMetadata.Id, resizingResult.Size);

                var thumbnailImageId   = _imageIdentifierProvider.GenerateUniqueId();
                var thumbnailImageName = _imageIdentifierProvider.GetImageName(thumbnailImageId, fileExtension);

                var uploadedBlob = await _blobStorage.UploadImage(thumbnailImageName, resizingResult.Image, ImageSizeType.Thumbnail, mimeType, CancellationToken.None);

                imageMetadata.Thumbnails.Add(new ImageThumbnail
                {
                    Id           = thumbnailImageId,
                    Name         = thumbnailImageName,
                    MD5Hash      = uploadedBlob.MD5Hash,
                    DateAddedUtc = uploadedBlob.DateAdded.DateTime,
                    MimeType     = mimeType,
                    Height       = resizingResult.Size.Height,
                    Width        = resizingResult.Size.Width,
                    SizeBytes    = resizingResult.Size.Bytes
                });

                imageStream = resizingResult.Image;
            }

            imageStream.Dispose();

            imageMetadata.Thumbnails.Reverse();
            await _metadataStorage.SetMetadata(imageMetadata, CancellationToken.None);

            _logger.LogInformation(ThumbnailsGenerated, imageMetadata.Thumbnails.Count, imageId);

            return(imageMetadata.Thumbnails.Select(x => new ImageThumbnailGeneratingResult
            {
                Id = x.Id,
                Width = x.Width,
                Height = x.Height,
                MimeType = x.MimeType
            }).ToList());
        }