# friendly-img-hash-js

> User friendly algorithms for generating image hashes.

Latest version **1.1.3** (published 2025-11-02) · MIT license · 0 weekly downloads

## Install

```sh
npm install friendly-img-hash-js
pnpm add friendly-img-hash-js
yarn add friendly-img-hash-js
bun add friendly-img-hash-js
```

## Health

**Score 50/100 (C)** — status: stable.

Positive: esm support; no vulnerabilities.

Warnings: low downloads; no types.

## Facts

| | |
|---|---|
| Version | 1.1.3 |
| Published | 2025-11-02 |
| First published | 2023-08-24 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM + CommonJS |
| Dependencies | 5 |
| Unpacked size | 9.1 KB |
| Known vulnerabilities | 0 (+1 in 1 direct dependencies) |
| Install scripts | no |
| Author | Kobaj |
| Maintainers | kobaj |
| Keywords | hash, image, perceptual, similarity, distance, difference |

## Links

- npm: https://www.npmjs.com/package/friendly-img-hash-js
- Repository: https://gitlab.com/kobaj/img-hash-js
- Homepage: https://gitlab.com/kobaj/img-hash-js#readme
- Issues: https://gitlab.com/kobaj/img-hash-js/issues
- npm.io page: https://npm.io/package/friendly-img-hash-js

## Dependencies (5)

- [sharp](https://npm.io/package/sharp.md) ^0.34.4
- [utif2](https://npm.io/package/utif2.md) ^4.1.0
- [bmp-js](https://npm.io/package/bmp-js.md) ^0.1.0
- [image-type](https://npm.io/package/image-type.md) ^6.0.0
- [img-hash-js-core](https://npm.io/package/img-hash-js-core.md) ^1.0.7

## Alternatives

- [exif-parser](https://npm.io/package/exif-parser.md) — 3.8M weekly downloads
- [vite-plugin-compression](https://npm.io/package/vite-plugin-compression.md) — 569.5K weekly downloads
- [pica](https://npm.io/package/pica.md) — 442.4K weekly downloads
- [@reportportal/client-javascript](https://npm.io/package/@reportportal/client-javascript.md) — 408.8K weekly downloads
- [@tldraw/state](https://npm.io/package/@tldraw/state.md) — 316.0K weekly downloads

## Recent versions

- 1.1.3 (latest) — 2025-11-02
- 1.1.2 — 2023-11-17
- 1.1.1 — 2023-08-31
- 1.1.0 — 2023-08-31
- 1.0.4 — 2023-08-25
- 1.0.3 — 2023-08-25
- 1.0.2 — 2023-08-25
- 1.0.1 — 2023-08-24
- 1.0.0 — 2023-08-24

## README

# friendly-img-hash-js

A js implementation of https://docs.rs/img_hash/ which itself is based on the work of http://www.hackerfactor.com/.

> **NOTE:** If you want a no dependency, bare bones, and synchronous version of this library then check out https://www.npmjs.com/package/img-hash-js-core.

# Installation via NPM

```
npm install friendly-img-hash-js
```

# Get started quickly

Browser example:

```
import { hash } from 'friendly-img-hash-js';

// Image formats support depends on your browser
// https://en.wikipedia.org/wiki/Comparison_of_web_browsers#Image_format_support

// Construct a hash!
const result = await hash('https://my-sweet-image-url.png');
```

Nodejs Example:

```
import { hash } from 'friendly-img-hash-js';

// Image formats supported are jpeg, png, webp, bitmap, tiff, and avif

// Construct a hash!
const result = await hash('./some/file/on/disk.png');

```

# Detailed examples and options

You can see all options, including defaults, inside the file [index.js](https://gitlab.com/kobaj/img-hash-js-core/-/blob/main/index.js). Options can be mixed and matched as much as you like!

Different output types.

```
import { hash, Convert } from 'friendly-img-hash-js';

// You can specify the output format as one of the following
// BigInt -> an integer number like 7930450656421763612n
// Base64 -> a base64 string like KNCo2Uw3LtY=
// HexString -> a hex string like 6e0e9edaccc85a1c
// BitArray -> an array of bits like [0, 0, 1, 1, 0, 1, ...]

// Example of how to specify that option
console.log(
  await hash(image {
    output: Convert.options.BigInt
  })
);

```

Different hash algorithms.

```
import { hash, Hash } from 'friendly-img-hash-js';

// All of these come from 
// https://github.com/abonander/img_hash/blob/dbfb37f9251fea8f7efeabbb2267ddb1fcd21ca6/src/alg/mod.rs#L20

// You can specify the output format as one of the following
// Mean -> Simple algorithm, not very resiliant
// Gradient -> Very effective and efficient algorithm, recommended!
// VerticalGradient -> Same as gradient, but better for tall images
// DoubleGradient -> Computationally expensive, but may improve results

// Example of how to specify that option
console.log(
  await hash(image, {
    algorithm: Hash.options.Gradient
  })
);

```

Enable Discrete Cosine Transform (DCT)

```
import { hash, Dct } from 'friendly-img-hash-js';

const imageBytes = // get your image bytes following the examples above.

// You can specify the output format as one of the following
// None -> do not enable DCT
// Type2 -> enable DCT, more computation and slightly more robust results

// Example of how to specify that option
console.log(
  await hash(image, {
    dct: {
      algorithm: Dct.options.Type2
    }
  })
);

```

If you want to write your own algorithm, you can for any option. Here is an example of writing a custom hash function (MEDIAN) and a custom output function (BinaryString).

```
import { hash } from 'friendly-img-hash-js';

console.log(
  await hash(image, {
    // Dimension is required because of custom algorithm
    dimension: (width, height) => ({ width, height }), 
    algorithm: (bytes) => {
      const half = Math.floor(bytes.length / 2);
      const median = [...bytes].sort().at(half);
      return bytes.map((b) => b >= median).map((b) => (b ? 1 : 0));
    },
    output: (hashBits) => hashBits.join(''),
  })
); // Outputs "001010011001..." 
```

# Comparing Hashes

If you want to then compare two hashes, use something like Hamming distance or Levenshtein distance 

```
import { hash, Convert } from 'friendly-img-hash-js';
import leven from 'leven';

const config = { output: Convert.options.BigInt };

const result1 = await hash(image1, config);
const result2 = await hash(image2, config);

if (leven(result1.toString(), result2.toString()) <= 12) {
  console.log ('Images are very similar!');
}
```

# Alternatives

The following may fit your usecases better.

* [image-hasher](https://www.npmjs.com/package/img-hasher) 
* [blockhash-core](https://www.npmjs.com/package/blockhash-core)

---
_Source: https://npm.io/package/friendly-img-hash-js · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
