Julio Biason
4 years ago
commit
100ad30f84
5 changed files with 374 additions and 0 deletions
@ -0,0 +1,323 @@
|
||||
# This file is automatically @generated by Cargo. |
||||
# It is not intended for manual editing. |
||||
[[package]] |
||||
name = "adler32" |
||||
version = "1.2.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" |
||||
|
||||
[[package]] |
||||
name = "autocfg" |
||||
version = "1.0.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" |
||||
|
||||
[[package]] |
||||
name = "bitflags" |
||||
version = "1.2.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" |
||||
|
||||
[[package]] |
||||
name = "bytemuck" |
||||
version = "1.3.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "db7a1029718df60331e557c9e83a55523c955e5dd2a7bfeffad6bbd50b538ae9" |
||||
|
||||
[[package]] |
||||
name = "byteorder" |
||||
version = "1.3.4" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" |
||||
|
||||
[[package]] |
||||
name = "cfg-if" |
||||
version = "0.1.10" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" |
||||
|
||||
[[package]] |
||||
name = "color_quant" |
||||
version = "1.0.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" |
||||
|
||||
[[package]] |
||||
name = "crc32fast" |
||||
version = "1.2.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" |
||||
dependencies = [ |
||||
"cfg-if", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "crossbeam-deque" |
||||
version = "0.7.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" |
||||
dependencies = [ |
||||
"crossbeam-epoch", |
||||
"crossbeam-utils", |
||||
"maybe-uninit", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "crossbeam-epoch" |
||||
version = "0.8.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" |
||||
dependencies = [ |
||||
"autocfg", |
||||
"cfg-if", |
||||
"crossbeam-utils", |
||||
"lazy_static", |
||||
"maybe-uninit", |
||||
"memoffset", |
||||
"scopeguard", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "crossbeam-queue" |
||||
version = "0.2.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" |
||||
dependencies = [ |
||||
"cfg-if", |
||||
"crossbeam-utils", |
||||
"maybe-uninit", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "crossbeam-utils" |
||||
version = "0.7.2" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" |
||||
dependencies = [ |
||||
"autocfg", |
||||
"cfg-if", |
||||
"lazy_static", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "deflate" |
||||
version = "0.8.6" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" |
||||
dependencies = [ |
||||
"adler32", |
||||
"byteorder", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "dhash" |
||||
version = "0.1.0" |
||||
dependencies = [ |
||||
"image", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "either" |
||||
version = "1.6.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "cd56b59865bce947ac5958779cfa508f6c3b9497cc762b7e24a12d11ccde2c4f" |
||||
|
||||
[[package]] |
||||
name = "gif" |
||||
version = "0.10.3" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "471d90201b3b223f3451cd4ad53e34295f16a1df17b1edf3736d47761c3981af" |
||||
dependencies = [ |
||||
"color_quant", |
||||
"lzw", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "hermit-abi" |
||||
version = "0.1.15" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" |
||||
dependencies = [ |
||||
"libc", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "image" |
||||
version = "0.23.8" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "543904170510c1b5fb65140485d84de4a57fddb2ed685481e9020ce3d2c9f64c" |
||||
dependencies = [ |
||||
"bytemuck", |
||||
"byteorder", |
||||
"gif", |
||||
"jpeg-decoder", |
||||
"num-iter", |
||||
"num-rational", |
||||
"num-traits", |
||||
"png", |
||||
"scoped_threadpool", |
||||
"tiff", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "jpeg-decoder" |
||||
version = "0.1.20" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "cc797adac5f083b8ff0ca6f6294a999393d76e197c36488e2ef732c4715f6fa3" |
||||
dependencies = [ |
||||
"byteorder", |
||||
"rayon", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "lazy_static" |
||||
version = "1.4.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" |
||||
|
||||
[[package]] |
||||
name = "libc" |
||||
version = "0.2.76" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "755456fae044e6fa1ebbbd1b3e902ae19e73097ed4ed87bb79934a867c007bc3" |
||||
|
||||
[[package]] |
||||
name = "lzw" |
||||
version = "0.10.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" |
||||
|
||||
[[package]] |
||||
name = "maybe-uninit" |
||||
version = "2.0.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" |
||||
|
||||
[[package]] |
||||
name = "memoffset" |
||||
version = "0.5.5" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" |
||||
dependencies = [ |
||||
"autocfg", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "miniz_oxide" |
||||
version = "0.3.7" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" |
||||
dependencies = [ |
||||
"adler32", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "num-integer" |
||||
version = "0.1.43" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" |
||||
dependencies = [ |
||||
"autocfg", |
||||
"num-traits", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "num-iter" |
||||
version = "0.1.41" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "7a6e6b7c748f995c4c29c5f5ae0248536e04a5739927c74ec0fa564805094b9f" |
||||
dependencies = [ |
||||
"autocfg", |
||||
"num-integer", |
||||
"num-traits", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "num-rational" |
||||
version = "0.3.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "a5b4d7360f362cfb50dde8143501e6940b22f644be75a4cc90b2d81968908138" |
||||
dependencies = [ |
||||
"autocfg", |
||||
"num-integer", |
||||
"num-traits", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "num-traits" |
||||
version = "0.2.12" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" |
||||
dependencies = [ |
||||
"autocfg", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "num_cpus" |
||||
version = "1.13.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" |
||||
dependencies = [ |
||||
"hermit-abi", |
||||
"libc", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "png" |
||||
version = "0.16.7" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "dfe7f9f1c730833200b134370e1d5098964231af8450bce9b78ee3ab5278b970" |
||||
dependencies = [ |
||||
"bitflags", |
||||
"crc32fast", |
||||
"deflate", |
||||
"miniz_oxide", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "rayon" |
||||
version = "1.3.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "62f02856753d04e03e26929f820d0a0a337ebe71f849801eea335d464b349080" |
||||
dependencies = [ |
||||
"autocfg", |
||||
"crossbeam-deque", |
||||
"either", |
||||
"rayon-core", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "rayon-core" |
||||
version = "1.7.1" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" |
||||
dependencies = [ |
||||
"crossbeam-deque", |
||||
"crossbeam-queue", |
||||
"crossbeam-utils", |
||||
"lazy_static", |
||||
"num_cpus", |
||||
] |
||||
|
||||
[[package]] |
||||
name = "scoped_threadpool" |
||||
version = "0.1.9" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" |
||||
|
||||
[[package]] |
||||
name = "scopeguard" |
||||
version = "1.1.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" |
||||
|
||||
[[package]] |
||||
name = "tiff" |
||||
version = "0.5.0" |
||||
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||
checksum = "3f3b8a87c4da944c3f27e5943289171ac71a6150a79ff6bacfff06d159dfff2f" |
||||
dependencies = [ |
||||
"byteorder", |
||||
"lzw", |
||||
"miniz_oxide", |
||||
] |
@ -0,0 +1,10 @@
|
||||
[package] |
||||
name = "dhash" |
||||
version = "0.1.0" |
||||
authors = ["Julio Biason <julio.biason@pm.me>"] |
||||
edition = "2018" |
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||
|
||||
[dependencies] |
||||
image = "0.23" |
@ -0,0 +1,31 @@
|
||||
use image; |
||||
|
||||
pub enum DhashError { |
||||
FileDoesNotExist, |
||||
} |
||||
|
||||
impl std::convert::From<image::error::ImageError> for DhashError { |
||||
fn from(_: image::error::ImageError) -> DhashError { |
||||
DhashError::FileDoesNotExist |
||||
} |
||||
} |
||||
|
||||
pub fn dhash(filename: &str) -> Result<String, DhashError> { |
||||
let image = image::open(filename)? |
||||
.resize_exact(9, 8, image::imageops::FilterType::Nearest) |
||||
.grayscale(); |
||||
let image_bytes = image |
||||
.to_bytes(); |
||||
let mut all_hash: u64 = 0; |
||||
for byte in 0..8 { |
||||
let line = byte * 9; |
||||
for bits in 0..8 { |
||||
all_hash <<= 1; |
||||
if image_bytes[line + bits] > image_bytes[line + bits + 1] { |
||||
all_hash = all_hash | 0b00000001; |
||||
} |
||||
} |
||||
} |
||||
|
||||
Ok(format!("{:#018x}", all_hash).into()) |
||||
} |
Loading…
Reference in new issue