/// <inheritdoc />
        public ImageDifferenceHash64 Compute(Stream stream, IImageTransformer transformer)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            if (transformer == null)
            {
                throw new ArgumentNullException(nameof(transformer));
            }

            var pixels = transformer.ConvertToGreyscaleAndResize(stream, 9, 8);

            var hash = 0UL;
            var pos  = 0;

            for (var y = 0; y < 8; y++)
            {
                var row = y * 9;

                for (var x = 0; x < 8; x++)
                {
                    if (pixels[row + x] > pixels[row + x + 1])
                    {
                        hash |= (1UL << pos);
                    }

                    pos++;
                }
            }

            return(new ImageDifferenceHash64(hash));
        }
Esempio n. 2
0
        /// <summary>
        /// Calculates a 64 bit hash for the given image using median algorithm.
        ///
        /// Works by converting the image to 8x8 greyscale image, finding the median pixel value from it, and then marking
        /// all pixels where value is greater than median value as 1 in the resulting hash. Should be more resistant to non-linear
        /// image edits when compared against average based implementation.
        /// </summary>
        /// <param name="sourceStream">Stream containing an image to be hashed.</param>
        /// <returns>64 bit median hash of the input image.</returns>
        internal static ulong Calculate(Stream sourceStream, IImageTransformer _transformer)
        {
            byte[] pixels = _transformer.TransformImage(sourceStream, 8, 8);

            // Calculate median
            List <byte> pixelList = new List <byte>(pixels);

            pixelList.Sort();
            // Even amount of pixels
            byte median = (byte)((pixelList[31] + pixelList[32]) / 2);

            // Iterate pixels and set them to 1 if over median and 0 if lower.
            ulong hash = 0UL;

            for (int i = 0; i < 64; i++)
            {
                if (pixels[i] > median)
                {
                    hash |= 1UL << i;
                }
            }

            // Done
            return(hash);
        }
Esempio n. 3
0
        /// <summary>
        /// Calculates a 256 bit hash for the given image using median algorithm.
        ///
        /// Works by converting the image to 16x16 greyscale image, finding the median pixel value from it, and then marking
        /// all pixels where value is greater than median value as 1 in the resulting hash. Should be more resistant to non-linear
        /// image edits when compared agains average based implementation.
        /// </summary>
        /// <param name="sourceStream">Stream containing an image to be hashed.</param>
        /// <returns>256 bit median hash of the input image. Composed of 4 ulongs.</returns>
        internal static ulong[] Calculate(Stream sourceStream, IImageTransformer _transformer)
        {
            byte[] pixels = _transformer.TransformImage(sourceStream, 16, 16);

            // Calculate median
            List <byte> pixelList = new List <byte>(pixels);

            pixelList.Sort();
            // Even amount of pixels
            byte median = (byte)((pixelList[127] + pixelList[128]) / 2);

            // Iterate pixels and set them to 1 if over median and 0 if lower.
            ulong hash64 = 0UL;

            ulong[] hash = new ulong[4];
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 64; j++)
                {
                    if (pixels[(64 * i) + j] > median)
                    {
                        hash64 |= 1UL << j;
                    }
                }
                hash[i] = hash64;
                hash64  = 0UL;
            }

            // Done
            return(hash);
        }
Esempio n. 4
0
        //[CompilerGenerated]
        //private static Comparison<ThumbnailRecord> <>9__CachedAnonymousMethodDelegate1;

        public SourceMapRecord(Layer layer, SourceMap sourceMap, MapTileSourceFactory mapTileSourceFactory)
        {
            displayName      = sourceMap.displayName;
            sourceMapInfo    = sourceMap.sourceMapInfo;
            userBoundingRect = sourceMap.GetUserBoundingBox(mapTileSourceFactory);
            maxZoom          = sourceMap.sourceMapRenderOptions.maxZoom;
            try
            {
                imageTransformer =
                    sourceMap.registration.warpStyle.getImageTransformer(sourceMap.registration,
                                                                         InterpolationMode.Invalid);
            }
            catch (Exception)
            {
            }

            foreach (Legend current in sourceMap.legendList)
            {
                legendRecords.Add(new LegendRecord("legends",
                                                   sourceMap.GetLegendFilename(current),
                                                   current.displayName,
                                                   current.GetOutputSizeSynchronously(mapTileSourceFactory.CreateDisplayableUnwarpedSource(sourceMap)
                                                                                      .GetUserBounds(current.latentRegionHolder, FutureFeatures.Cached))));
            }

            sourceMapLegendFrame = new SourceMapLegendFrame(layer,
                                                            sourceMap,
                                                            legendRecords,
                                                            thumbnailForLegendFrame);
        }
Esempio n. 5
0
        /// <inheritdoc />
        public ImageAverageHash Compute(Stream stream, IImageTransformer transformer)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            if (transformer == null)
            {
                throw new ArgumentNullException(nameof(transformer));
            }

            var pixels = transformer.ConvertToGreyscaleAndResize(stream, 8, 8);

            var total   = pixels.Sum(pixel => pixel);
            var average = total / 64;

            var hash = 0UL;

            for (var i = 0; i < 64; i++)
            {
                if (pixels[i] > average)
                {
                    hash |= (1UL << i);
                }
            }

            return(new ImageAverageHash(hash));
        }
 private static void Transform(IImageTransformer imageTransformer, string url)
 {
     for (int i = 0; i < 100; i++)
     {
         //Console.WriteLine(i);
         imageTransformer.Transform(url);
     }
 }
Esempio n. 7
0
 public AddImageThumbnailCommandHandler(
     AzureStorageRepository repository,
     IOptions <AzureMediaStorageOptions> storageConfig,
     IImageTransformer imageTransofrmer)
 {
     _repository       = repository ?? throw new ArgumentNullException(nameof(repository));
     _storageConfig    = storageConfig ?? throw new ArgumentNullException(nameof(storageConfig));
     _imageTransofrmer = imageTransofrmer ?? throw new ArgumentNullException(nameof(imageTransofrmer));
 }
Esempio n. 8
0
 public ImageService(
     ITransformedImageCache imageCacheHandler,
     IOriginalImageBlobStorage originalImageStorage,
     IImageTransformer imageTransformer,
     ILogger <ImageService> logger)
 {
     this.imageCacheHandler    = imageCacheHandler;
     this.originalImageStorage = originalImageStorage;
     this.imageTransformer     = imageTransformer;
     this.logger = logger;
 }
Esempio n. 9
0
 public ImageService(IImageTransformer imageResizer, IFileSystemService imageinfoProvider, IPhotoService photoService, IDynamicConfig dynamicConfig,
                     IBackgroundTaskQueue queue, ILogger <ImageService> logger, IImageMetadataService metadataService)
 {
     _imageTransformer  = imageResizer;
     _fileSystemService = imageinfoProvider;
     _photoService      = photoService;
     _dynamicConfig     = dynamicConfig;
     _queue             = queue;
     _logger            = logger;
     _metadataService   = metadataService;
 }
Esempio n. 10
0
        public ImageSharpImageProccessor(
            IImageTransformer imageTransformer,
            IOptions <ImageSharpImageProccessorOptions> options,
            ILogger <ImageSharpImageProccessor> logger)
        {
            _imageTransformer = imageTransformer ?? throw new ArgumentNullException(nameof(imageTransformer));
            _options          = options.Value ?? throw new ArgumentNullException(nameof(options));
            _logger           = logger ?? throw new ArgumentNullException(nameof(logger));

            _configuration = Configuration.Default;
        }
Esempio n. 11
0
        /// <summary>
        /// Calculates a hash for the given image using dct algorithm
        /// </summary>
        /// <param name="sourceStream">Stream to the image used for hash calculation.</param>
        /// <returns>64 bit difference hash of the input image.</returns>
        internal ulong Calculate(Stream sourceStream, IImageTransformer _transformer)
        {
            lock (_dctMatrixLockObject) {
                if (!_isDctMatrixInitialized)
                {
                    _dctMatrix = GenerateDctMatrix(32);
                    _isDctMatrixInitialized = true;
                }
            }

            byte[] pixels = _transformer.TransformImage(sourceStream, 32, 32);

            // Copy pixel data and convert to float
            float[] fPixels = new float[1024];
            for (int i = 0; i < 1024; i++)
            {
                fPixels[i] = pixels[i] / 255.0f;
            }

            // Calculate dct
            float[][] dctPixels = ComputeDct(fPixels, _dctMatrix);

            // Get 8*8 area from 1,1 to 8,8, ignoring lowest frequencies for improved detection
            float[] dctHashPixels = new float[64];
            for (int x = 0; x < 8; x++)
            {
                for (int y = 0; y < 8; y++)
                {
                    dctHashPixels[x + (y * 8)] = dctPixels[x + 1][y + 1];
                }
            }

            // Calculate median
            List <float> pixelList = new List <float>(dctHashPixels);

            pixelList.Sort();
            // Even amount of pixels
            float median = (pixelList[31] + pixelList[32]) / 2;

            // Iterate pixels and set them to 1 if over median and 0 if lower.
            ulong hash = 0UL;

            for (int i = 0; i < 64; i++)
            {
                if (dctHashPixels[i] > median)
                {
                    hash |= 1UL << i;
                }
            }

            // Done
            return(hash);
        }
        /// <inheritdoc />
        public ImageDifferenceHash256 Compute(Stream stream, IImageTransformer transformer)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            if (transformer == null)
            {
                throw new ArgumentNullException(nameof(transformer));
            }

            var pixels = transformer.ConvertToGreyscaleAndResize(stream, 17, 16);

            var hash = new ulong[4];

            var pos  = 0;
            var part = 0;

            for (var y = 0; y < 16; y++)
            {
                var row = y * 17;

                for (var x = 0; x < 16; x++)
                {
                    if (pixels[row + x] > pixels[row + x + 1])
                    {
                        hash[part] |= (1UL << pos);
                    }

                    if (pos == 63)
                    {
                        pos = 0;
                        part++;
                    }
                    else
                    {
                        pos++;
                    }
                }
            }

            return(new ImageDifferenceHash256(hash));
        }
Esempio n. 13
0
        /// <summary>
        /// Calculates a 64 bit hash for the given image using average algorithm.
        /// </summary>
        /// <param name="sourceStream">Stream containing an image to be hashed.</param>
        /// <returns>64 bit average hash of the input image.</returns>
        internal static ulong Calculate(Stream sourceStream, IImageTransformer _transformer)
        {
            byte[] pixels = _transformer.TransformImage(sourceStream, 8, 8);

            // Calculate average
            List <byte> pixelList = new List <byte>(pixels);
            int         total     = pixelList.Aggregate(0, (current, pixel) => current + pixel);
            int         average   = total / 64;

            // Iterate pixels and set them to 1 if over average and 0 if lower.
            ulong hash = 0UL;

            for (int i = 0; i < 64; i++)
            {
                if (pixels[i] > average)
                {
                    hash |= 1UL << i;
                }
            }

            // Done
            return(hash);
        }
        /// <summary>
        /// Calculates 64 bit hash for the given image using difference hash.
        ///
        /// See http://www.hackerfactor.com/blog/index.php?/archives/529-Kind-of-Like-That.html for algorithm description.
        /// </summary>
        /// <param name="sourceStream">Stream containing an image to be hashed.</param>
        /// <returns>64 bit difference hash of the input image.</returns>
        internal static ulong Calculate(Stream sourceStream, IImageTransformer _transformer)
        {
            byte[] pixels = _transformer.TransformImage(sourceStream, 9, 8);

            // Iterate pixels and set hash to 1 if the left pixel is brighter than the right pixel.
            ulong hash    = 0UL;
            int   hashPos = 0;

            for (int i = 0; i < 8; i++)
            {
                int rowStart = i * 9;
                for (int j = 0; j < 8; j++)
                {
                    if (pixels[rowStart + j] > pixels[rowStart + j + 1])
                    {
                        hash |= 1UL << hashPos;
                    }
                    hashPos++;
                }
            }

            // Done
            return(hash);
        }
 public ImagesLibrary(IImagesCache imagesCache, IImageLoader imageLoader, IImageTransformer imageTransformer)
 {
     _imagesCache      = imagesCache;
     _imageLoader      = imageLoader;
     _imageTransformer = imageTransformer;
 }
Esempio n. 16
0
 /// <summary>
 /// Initializes a new <see cref="ImageHasher"/>.
 /// </summary>
 /// <param name="transformer">Implementation of the image conversion methods.</param>
 /// <exception cref="ArgumentNullException">
 ///     The <paramref name="transformer"/> parameter is null.
 /// </exception>
 public ImageHasher(IImageTransformer transformer)
 {
     Transformer = transformer ?? throw new ArgumentNullException(nameof(transformer));
 }
Esempio n. 17
0
 /// <summary>
 /// Resizes the current image to the given dimensions.
 /// </summary>
 /// <param name="size">
 /// The <see cref="T:System.Drawing.Size"/> containing the width and height to set the image to.
 /// </param>
 /// <returns>
 public static IImageTransformer Resize(this IImageTransformer transformer, Size size)
 {
     return(transformer.Resize(new ResizeOptions {
         Size = size
     }));
 }
Esempio n. 18
0
 /// <summary>
 /// Initializes a new instance of the ImageHashes class using ImageMagickTransformer.
 /// </summary>
 public ImageHashes()
 {
     _transformer = new ImageMagickTransformer();
 }
Esempio n. 19
0
 /// <summary>
 /// Initializes a new instance of the ImageHashes class using the given IImageTransformer.
 /// </summary>
 /// <param name="transformer">Implementation of the IImageTransformer to be used for image transformation.</param>
 public ImageHashes(IImageTransformer transformer) => _transformer = transformer;
 public ImagesController(IImageStore imageStore, IImageTransformer imageTransformer)
 {
     _imageStore       = imageStore;
     _imageTransformer = imageTransformer;
 }