<div dir="ltr">Hi all!<div><br></div><div>I'm pleased to announce the first release of blockhash, a perceptual image hash calculation tool based on algorithm described in Block Mean Value Based Image Perceptual Hashing by Bian Yang, Fan Gu and Xiamu Niu.</div><div><br></div><div><a href="https://hackage.haskell.org/package/blockhash">https://hackage.haskell.org/package/blockhash</a><br></div><div><br></div><div><a href="https://github.com/kseo/blockhash">https://github.com/kseo/blockhash</a><br></div><div><br></div><div>Program:</div><div><div><br></div><div>Usage: blockhash [-q|--quick] [-b|--bits ARG] filenames</div><div> blockhash</div><div><br></div><div>Available options:</div><div> -h,--help         Show this help text</div><div> -q,--quick        Use quick hashing method</div><div> -b,--bits ARG       Create hash of size N^2 bits.</div></div><div><br></div><div><br></div><div>Library:</div><div><br></div><div><div>import qualified Codec.Picture as P</div><div>import Data.Blockhash</div><div>import qualified Data.Vector.Generic as VG</div><div>import qualified Data.Vector.Unboxed as V</div><div><br></div><div>printHash :: FilePath -> IO ()</div><div>printHash :: filename = do</div><div> res <- P.readImage filename</div><div> case res of</div><div>  Left err -> putStrLn ("Fail to read: " ++ filename)</div><div>  Right dynamicImage -> do</div><div>   let rgbaImage = P.convertRGBA8 dynamicImage</div><div>     pixels = VG.convert (P.imageData rgbaImage)</div><div>     image = Image { imagePixels = pixels</div><div>            , imageWidth = P.imageWidth rgbaImage</div><div>            , imageHeight = P.imageHeight rgbaImage }</div><div>     hash = blockhash image 16 Precise</div><div>   putStrLn (show hash)</div></div><div><br></div><div><br></div><div>For further information on the blockhash algorithm, please visit the web site:</div><div><br></div><div><a href="http://blockhash.io/">http://blockhash.io/</a><br></div><div><br></div><div>Thanks,<br></div><div>Kwang Yul Seo</div><div><br></div></div>