image-hash 7.0.1 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,117 +7,119 @@ Supports JPG, PNG and WebP
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- npm i -S image-hash
10
+ npm i image-hash
11
11
  ```
12
12
 
13
+ Requires Node.js 22.12 or later.
14
+
13
15
  ## Use
14
16
 
17
+ `imageHash` returns a promise that resolves to the hash as a hex string.
18
+
15
19
  ```javascript
16
- const { imageHash }= require('image-hash');
17
-
18
- // remote file simple
19
- imageHash('https://ichef-1.bbci.co.uk/news/660/cpsprodpb/7F76/production/_95703623_mediaitem95703620.jpg', 16, true, (error, data) => {
20
- if (error) throw error;
21
- console.log(data);
22
- // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
23
- });
24
-
25
- // remote file with fetch config object
26
- const config = {
27
- url: 'https://ichef-1.bbci.co.uk/news/660/cpsprodpb/7F76/production/_95703623_mediaitem95703620.jpg'
28
- };
29
-
30
- imageHash(config, 16, true, (error, data) => {
31
- if (error) throw error;
32
- console.log(data);
33
- // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
34
- });
35
-
36
- //local file
37
- imageHash('./_95695590_tv039055678.jpg', 16, true, (error, data) => {
38
- if (error) throw error;
39
- console.log(data);
40
- // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
41
- });
42
-
43
- //Buffer
44
- const fBuffer = fs.readFileSync(__dirname + '/example/_95695591_tv039055678.jpeg');
45
- imageHash({
46
- ext: 'image/jpeg',
47
- data: fBuffer
48
- }, 16, true, (error, data) => {
49
- if(error) throw error;
50
- console.log(data);
51
- // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
52
- });
53
-
54
- //Buffer, without ext arg
55
- const fBuffer = fs.readFileSync(__dirname + '/example/_95695591_tv039055678.jpeg');
56
- imageHash({
57
- data: fBuffer
58
- }, 16, true, (error, data) => {
59
- if(error) throw error;
60
- console.log(data);
61
- // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
62
- });
63
- ```
20
+ import { readFile } from 'node:fs/promises';
21
+ import { imageHash } from 'image-hash';
64
22
 
65
- ## API
23
+ // local file
24
+ const hash = await imageHash('./_95695590_tv039055678.jpg', 16, true);
25
+ console.log(hash);
26
+ // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
66
27
 
67
- ```typescript
68
- // name
69
- imageHash(location, bits, precise, callback);
28
+ // bits and precise are optional, and default to 16 and true
29
+ await imageHash('./_95695590_tv039055678.jpg');
30
+
31
+ // remote file
32
+ await imageHash('https://ichef-1.bbci.co.uk/news/660/cpsprodpb/7F76/production/_95703623_mediaitem95703620.jpg', 16, true);
33
+
34
+ // remote file with fetch options
35
+ await imageHash({
36
+ url: 'https://ichef-1.bbci.co.uk/news/660/cpsprodpb/7F76/production/_95703623_mediaitem95703620.jpg',
37
+ headers: { authorization: 'Bearer token' },
38
+ signal: AbortSignal.timeout(10_000),
39
+ }, 16, true);
70
40
 
71
- // types
72
- imageHash(string|object, int, bool, function);
41
+ // Buffer
42
+ const data = await readFile('./_95695591_tv039055678.jpeg');
43
+ await imageHash(data, 16, true);
44
+
45
+ // Buffer, with mime type and file name
46
+ await imageHash({ ext: 'image/jpeg', data, name: 'photo.jpeg' }, 16, true);
47
+ ```
48
+
49
+ Errors (file not found, unsupported image type, failed requests) reject the promise, so use `try`/`catch` or `.catch()`.
50
+
51
+ ```javascript
52
+ try {
53
+ await imageHash('./missing.jpg');
54
+ } catch (error) {
55
+ console.error(error);
56
+ }
73
57
  ```
74
58
 
75
- ## SETTINGS
76
- Image hash will log out warnings if environment variable `VERBOSE` is set to true.
59
+ The package is ESM, but CommonJS projects can still `require` it:
60
+
61
+ ```javascript
62
+ const { imageHash } = require('image-hash');
77
63
 
64
+ imageHash('./_95695590_tv039055678.jpg').then((hash) => console.log(hash));
65
+ ```
78
66
 
79
- ### Image-Hash Arguments
67
+ ## API
80
68
 
81
- | Argument | Type | Description | Mandatory | Example |
82
- | -------- | ---- | ----------- | --------- | ------- |
83
- | location | `object` or `string` | A configuration object with a remote `url` (see below for details), `Buffer` object (See input types below for more details), or `String` with a valid url or file location | Yes | see above |
84
- | bits | `int` | The number of bits in a row. The more bits, the more unique the hash. | Yes | 8 |
85
- | precise | `bool` | Whether a precision algorithm is used. `true` Precise but slower, non-overlapping blocks. `false` Quick and crude, non-overlapping blocks. Method 2 is recommended as a good tradeoff between speed and good matches on any image size. The quick ones are only advisable when the image width and height are an even multiple of the number of blocks used. | Yes | `true` |
86
- | callback | `function` | A function with `error` and `data` arguments - see below |
69
+ ```typescript
70
+ imageHash(src: string | Buffer | UrlRequestObject | BufferObject, bits?: number, precise?: boolean): Promise<string>
71
+ ```
72
+
73
+ | Argument | Type | Description | Default | Example |
74
+ | -------- | ---- | ----------- | ------- | ------- |
75
+ | src | `string`, `Buffer` or `object` | A file path, an `http(s)` URL, a `Buffer`, a request object with a remote `url`, or a buffer object (see below) | Required | `'./image.jpg'` |
76
+ | bits | `number` | The number of bits in a row. The more bits, the more unique the hash. Must be a positive integer. | `16` | `8` |
77
+ | precise | `boolean` | Whether a precision algorithm is used. `true` Precise but slower, non-overlapping blocks. `false` Quick and crude, non-overlapping blocks. Method 2 is recommended as a good tradeoff between speed and good matches on any image size. The quick ones are only advisable when the image width and height are an even multiple of the number of blocks used. | `true` | `false` |
87
78
 
88
- #### Location Object Types
79
+ ### Source Object Types
89
80
 
90
81
  ```typescript
91
- // Url Request Object
92
- interface UrlRequestObject {
93
- encoding?: string | null,
94
- url: string | null,
95
- // Additional fetch RequestInit options may be provided
96
- [key: string]: unknown,
97
- };
98
-
99
- // Buffer Object
82
+ // Request object. Any other fetch options (headers, signal, ...) are passed to fetch.
83
+ interface UrlRequestObject extends RequestInit {
84
+ url: string;
85
+ }
86
+
87
+ // Buffer object
100
88
  interface BufferObject {
101
- ext?: string, // mime type of buffered file
102
- data: Buffer,
103
- name?: string // file name for buffered file
104
- };
89
+ ext?: string; // mime type of the image, detected from the data if omitted
90
+ data: Buffer;
91
+ name?: string; // file name, used to check the extension matches the mime type
92
+ }
105
93
  ```
106
94
 
107
- ### Callback Arguments
95
+ ## Settings
108
96
 
109
- | Argument | Type | Description |
110
- | -------- | ------------------------ | ----------------------------------------------------------------------------------- |
111
- | error | `Error Object` or `null` | If a run time error is detected this will be an `Error Object`, otherwise `null` |
112
- | data | `string` or `null` | If there is no run time error, this be will be your hashed result, otherwise `null` |
97
+ Image hash will log out warnings if environment variable `VERBOSE` is set.
98
+
99
+ ## Upgrading from v7
100
+
101
+ - The callback argument has been removed. `imageHash` now returns a promise.
102
+ - `bits` and `precise` are optional.
103
+ - A `Buffer` can be passed directly.
104
+ - The package is now ESM and requires Node.js 22.12 or later.
113
105
 
114
106
  ## Development
115
107
 
116
- I have made this with Typescript, ESLint, Jest, Babel and VSCode. All config files and global binaries are included. For developers using VS Code, make sure you have ESLint extension installed.
108
+ Built with TypeScript, ESLint and Vitest, using pnpm.
109
+
110
+ ```bash
111
+ pnpm install
112
+ pnpm test
113
+ pnpm run lint
114
+ pnpm run typecheck
115
+ pnpm run build
116
+ ```
117
+
118
+ ## Publishing
117
119
 
118
- ## Testing
120
+ Every push to `master` stages a new patch version on npm. The CI workflow bumps the patch version, stages it with `npm stage publish`, then pushes the version commit and tag back to `master`. The version goes live once a maintainer approves it on npm with 2FA. For a major or minor release, set `version` in `package.json` to the version before the one you want, e.g. `9.0.0` to publish `9.0.1`.
119
121
 
120
- `npm test`
122
+ Staging uses [npm trusted publishing](https://docs.npmjs.com/trusted-publishers), so no npm token is stored in GitHub. It is configured on npmjs.com under the package's Settings → Trusted Publisher, with the GitHub repository `danm/image-hash`, the workflow file `ci.yml`, and only staged publishing allowed.
121
123
 
122
124
  ## Credit
123
125
 
@@ -1,2 +1,8 @@
1
- declare const _default: (imgData: any, bits: any, method: any) => any;
1
+ export interface ImageData {
2
+ width: number;
3
+ height: number;
4
+ data: ArrayLike<number>;
5
+ }
6
+ export type HashMethod = 1 | 2;
7
+ declare const _default: (imgData: ImageData, bits: number, method: HashMethod) => string;
2
8
  export default _default;
package/lib/block-hash.js CHANGED
@@ -1,5 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
1
  const median = (data) => {
4
2
  const mdarr = data.slice(0).sort((a, b) => a - b);
5
3
  if (mdarr.length % 2 === 0) {
@@ -11,7 +9,7 @@ const translateBlocksToBits = (blocks, pixelsPerBlock) => {
11
9
  const newblocks = blocks;
12
10
  const halfBlockValue = (pixelsPerBlock * 256 * 3) / 2;
13
11
  const bandsize = blocks.length / 4;
14
- // Compare medians across four hor zontal bands
12
+ // Compare medians across four horizontal bands
15
13
  for (let i = 0; i < 4; i += 1) {
16
14
  const m = median(blocks.slice(i * bandsize, (i + 1) * bandsize));
17
15
  for (let j = i * bandsize; j < (i + 1) * bandsize; j += 1) {
@@ -34,6 +32,13 @@ const bitsToHexhash = (bitsArray) => {
34
32
  }
35
33
  return hex.join('');
36
34
  };
35
+ const pixelValue = (data, index) => {
36
+ const alpha = data.data[index + 3];
37
+ if (alpha === 0) {
38
+ return 765;
39
+ }
40
+ return data.data[index] + data.data[index + 1] + data.data[index + 2];
41
+ };
37
42
  const bmvbhashEven = (data, bits) => {
38
43
  const blocksizeX = Math.floor(data.width / bits);
39
44
  const blocksizeY = Math.floor(data.height / bits);
@@ -45,14 +50,7 @@ const bmvbhashEven = (data, bits) => {
45
50
  for (let ix = 0; ix < blocksizeX; ix += 1) {
46
51
  const cx = x * blocksizeX + ix;
47
52
  const cy = y * blocksizeY + iy;
48
- const ii = (cy * data.width + cx) * 4;
49
- const alpha = data.data[ii + 3];
50
- if (alpha === 0) {
51
- total += 765;
52
- }
53
- else {
54
- total += data.data[ii] + data.data[ii + 1] + data.data[ii + 2];
55
- }
53
+ total += pixelValue(data, (cy * data.width + cx) * 4);
56
54
  }
57
55
  }
58
56
  result.push(total);
@@ -62,37 +60,20 @@ const bmvbhashEven = (data, bits) => {
62
60
  return bitsToHexhash(result);
63
61
  };
64
62
  const bmvbhash = (data, bits) => {
65
- const result = [];
66
- let weightTop;
67
- let weightBottom;
68
- let weightLeft;
69
- let weightRight;
70
- let blockTop;
71
- let blockBottom;
72
- let blockLeft;
73
- let blockRight;
74
- let yMod;
75
- let yFrac;
76
- let yInt;
77
- let xMod;
78
- let xFrac;
79
- let xInt;
80
- const blocks = [];
81
63
  const evenX = data.width % bits === 0;
82
64
  const evenY = data.height % bits === 0;
83
65
  if (evenX && evenY) {
84
66
  return bmvbhashEven(data, bits);
85
67
  }
86
68
  // initialize blocks array with 0s
87
- for (let i = 0; i < bits; i += 1) {
88
- blocks.push([]);
89
- for (let j = 0; j < bits; j += 1) {
90
- blocks[i].push(0);
91
- }
92
- }
69
+ const blocks = Array.from({ length: bits }, () => new Array(bits).fill(0));
93
70
  const blockWidth = data.width / bits;
94
71
  const blockHeight = data.height / bits;
95
72
  for (let y = 0; y < data.height; y += 1) {
73
+ let weightTop;
74
+ let weightBottom;
75
+ let blockTop;
76
+ let blockBottom;
96
77
  if (evenY) {
97
78
  // don't bother dividing y, if the size evenly divides by bits
98
79
  blockBottom = Math.floor(y / blockHeight);
@@ -101,9 +82,9 @@ const bmvbhash = (data, bits) => {
101
82
  weightBottom = 0;
102
83
  }
103
84
  else {
104
- yMod = (y + 1) % blockHeight;
105
- yFrac = yMod - Math.floor(yMod);
106
- yInt = yMod - yFrac;
85
+ const yMod = (y + 1) % blockHeight;
86
+ const yFrac = yMod - Math.floor(yMod);
87
+ const yInt = yMod - yFrac;
107
88
  weightTop = 1 - yFrac;
108
89
  weightBottom = yFrac;
109
90
  // y_int will be 0 on bottom/right borders and on block boundaries
@@ -117,15 +98,11 @@ const bmvbhash = (data, bits) => {
117
98
  }
118
99
  }
119
100
  for (let x = 0; x < data.width; x += 1) {
120
- let avgvalue;
121
- const ii = (y * data.width + x) * 4;
122
- const alpha = data.data[ii + 3];
123
- if (alpha === 0) {
124
- avgvalue = 765;
125
- }
126
- else {
127
- avgvalue = data.data[ii] + data.data[ii + 1] + data.data[ii + 2];
128
- }
101
+ const avgvalue = pixelValue(data, (y * data.width + x) * 4);
102
+ let weightLeft;
103
+ let weightRight;
104
+ let blockLeft;
105
+ let blockRight;
129
106
  if (evenX) {
130
107
  blockRight = Math.floor(x / blockWidth);
131
108
  blockLeft = blockRight;
@@ -133,9 +110,9 @@ const bmvbhash = (data, bits) => {
133
110
  weightRight = 0;
134
111
  }
135
112
  else {
136
- xMod = (x + 1) % blockWidth;
137
- xFrac = xMod - Math.floor(xMod);
138
- xInt = xMod - xFrac;
113
+ const xMod = (x + 1) % blockWidth;
114
+ const xFrac = xMod - Math.floor(xMod);
115
+ const xInt = xMod - xFrac;
139
116
  weightLeft = 1 - xFrac;
140
117
  weightRight = xFrac;
141
118
  // x_int will be 0 on bottom/right borders and on block boundaries
@@ -155,25 +132,17 @@ const bmvbhash = (data, bits) => {
155
132
  blocks[blockBottom][blockRight] += avgvalue * weightBottom * weightRight;
156
133
  }
157
134
  }
158
- for (let i = 0; i < bits; i += 1) {
159
- for (let j = 0; j < bits; j += 1) {
160
- result.push(blocks[i][j]);
161
- }
162
- }
135
+ const result = blocks.flat();
163
136
  translateBlocksToBits(result, blockWidth * blockHeight);
164
137
  return bitsToHexhash(result);
165
138
  };
166
- exports.default = (imgData, bits, method) => {
167
- let hash;
139
+ export default (imgData, bits, method) => {
168
140
  if (method === 1) {
169
- hash = bmvbhashEven(imgData, bits);
170
- }
171
- else if (method === 2) {
172
- hash = bmvbhash(imgData, bits);
141
+ return bmvbhashEven(imgData, bits);
173
142
  }
174
- else {
175
- throw new Error('Bad hashing method');
143
+ if (method === 2) {
144
+ return bmvbhash(imgData, bits);
176
145
  }
177
- return hash;
146
+ throw new Error('Bad hashing method');
178
147
  };
179
148
  //# sourceMappingURL=block-hash.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-hash.js","sourceRoot":"","sources":["../src/block-hash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block-hash.js","sourceRoot":"","sources":["../src/block-hash.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,12 +1,23 @@
1
- import { Buffer } from 'buffer';
2
- export interface UrlRequestObject {
1
+ import { Buffer } from 'node:buffer';
2
+ export interface UrlRequestObject extends RequestInit {
3
+ url: string;
4
+ /** @deprecated Ignored. Kept for backwards compatibility. */
3
5
  encoding?: string | null;
4
- url: string | null;
5
- [key: string]: unknown;
6
6
  }
7
7
  export interface BufferObject {
8
+ /** Mime type of the image, e.g. `image/jpeg`. Detected from the data if omitted. */
8
9
  ext?: string;
9
10
  data: Buffer;
11
+ /** File name, used to check the file extension matches the mime type. */
10
12
  name?: string;
11
13
  }
12
- export declare const imageHash: (oldSrc: string | UrlRequestObject | BufferObject, bits: any, method: any, cb: any) => void;
14
+ export type ImageSource = string | Buffer | UrlRequestObject | BufferObject;
15
+ /**
16
+ * Create a perceptual hash of an image.
17
+ *
18
+ * @param src A file path, an http(s) URL, a Buffer, a `BufferObject` or a `UrlRequestObject`.
19
+ * @param bits The number of bits in a row. The more bits, the more unique the hash.
20
+ * @param precise `true` for the precise but slower algorithm, `false` for the quick one.
21
+ * @returns The hash as a hex string.
22
+ */
23
+ export declare const imageHash: (src: ImageSource, bits?: number, precise?: boolean) => Promise<string>;
package/lib/index.js CHANGED
@@ -1,195 +1,85 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.imageHash = void 0;
16
- const fs_1 = __importDefault(require("fs"));
17
- const buffer_1 = require("buffer");
18
- const file_type_1 = require("file-type");
19
- const jpeg_js_1 = __importDefault(require("jpeg-js"));
20
- const pngjs_1 = require("pngjs");
21
- const url_1 = require("url");
22
- const webp_1 = __importDefault(require("@cwasm/webp"));
23
- const block_hash_1 = __importDefault(require("./block-hash"));
24
- const processPNG = (data, bits, method, cb) => {
25
- try {
26
- const png = pngjs_1.PNG.sync.read(data);
27
- const res = (0, block_hash_1.default)(png, bits, method ? 2 : 1);
28
- cb(null, res);
29
- }
30
- catch (e) {
31
- cb(e);
1
+ import { Buffer } from 'node:buffer';
2
+ import { readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import webp from '@cwasm/webp';
5
+ import { fileTypeFromBuffer } from 'file-type';
6
+ import jpeg from 'jpeg-js';
7
+ import { PNG } from 'pngjs';
8
+ import blockhash from './block-hash.js';
9
+ const decoders = new Map([
10
+ ['image/png', { extensions: ['png'], decode: (data) => PNG.sync.read(data) }],
11
+ ['image/jpeg', { extensions: ['jpg', 'jpeg'], decode: (data) => jpeg.decode(data) }],
12
+ ['image/webp', { extensions: ['webp'], decode: (data) => webp.decode(data) }],
13
+ ]);
14
+ const isRemoteUrl = (src) => /^https?:\/\//i.test(src);
15
+ const isBufferObject = (src) => ('data' in src && Buffer.isBuffer(src.data));
16
+ const isUrlRequestObject = (src) => ('url' in src && typeof src.url === 'string' && src.url.length > 0);
17
+ const fetchImage = async (src) => {
18
+ // `encoding` is a leftover from the `request` library and is not a valid fetch option
19
+ const { url, encoding, ...init } = typeof src === 'string' ? { url: src } : src;
20
+ const response = await fetch(url, init);
21
+ if (!response.ok) {
22
+ await response.body?.cancel();
23
+ throw new Error(`Failed to fetch image. HTTP status: ${response.status} ${response.statusText}`);
32
24
  }
25
+ const data = Buffer.from(await response.arrayBuffer());
26
+ return { data, name: new URL(response.url || url).pathname };
33
27
  };
34
- const processJPG = (data, bits, method, cb) => {
35
- try {
36
- const decoded = jpeg_js_1.default.decode(data);
37
- const res = (0, block_hash_1.default)(decoded, bits, method ? 2 : 1);
38
- cb(null, res);
28
+ const loadImage = async (src) => {
29
+ if (typeof src === 'string') {
30
+ if (isRemoteUrl(src)) {
31
+ return fetchImage(src);
32
+ }
33
+ return { data: await readFile(src), name: src };
39
34
  }
40
- catch (e) {
41
- cb(e);
35
+ if (Buffer.isBuffer(src)) {
36
+ return { data: src };
42
37
  }
43
- };
44
- const processWebp = (data, bits, method, cb) => {
45
- try {
46
- const decoded = webp_1.default.decode(data);
47
- const res = (0, block_hash_1.default)(decoded, bits, method ? 2 : 1);
48
- cb(null, res);
38
+ if (isBufferObject(src)) {
39
+ return { data: src.data, name: src.name, mime: src.ext || undefined };
49
40
  }
50
- catch (e) {
51
- cb(e);
41
+ if (isUrlRequestObject(src)) {
42
+ return fetchImage(src);
52
43
  }
44
+ throw new TypeError('Unrecognized image source');
53
45
  };
54
- const isUrlRequestObject = (obj) => {
55
- const casted = obj;
56
- return casted.url && casted.url.length > 0;
57
- };
58
- const isBufferObject = (obj) => {
59
- const casted = obj;
60
- return buffer_1.Buffer.isBuffer(casted.data)
61
- || (buffer_1.Buffer.isBuffer(casted.data) && (casted.ext && casted.ext.length > 0));
62
- };
63
- // eslint-disable-next-line
64
- const imageHash = (oldSrc, bits, method, cb) => {
65
- const src = oldSrc;
66
- const getFileType = (data) => __awaiter(void 0, void 0, void 0, function* () {
67
- if (typeof src !== 'string' && isBufferObject(src) && src.ext) {
68
- return {
69
- mime: src.ext,
70
- };
71
- }
72
- if (buffer_1.Buffer.isBuffer(data)) {
73
- return (0, file_type_1.fileTypeFromBuffer)(data);
74
- }
75
- if (typeof src === 'string') {
76
- return (0, file_type_1.fileTypeFromFile)(src);
77
- }
78
- return '';
79
- });
80
- const checkFileType = (name, data) => {
81
- getFileType(data).then((type) => {
82
- // what is the image type
83
- if (!type) {
84
- cb(new Error('Mime type not found'));
85
- return;
86
- }
87
- if (name && name.lastIndexOf('.') > 0) {
88
- const ext = name
89
- .split('.')
90
- .pop()
91
- .toLowerCase();
92
- if (ext === 'png' && type.mime === 'image/png') {
93
- processPNG(data, bits, method, cb);
94
- }
95
- else if ((ext === 'jpg' || ext === 'jpeg') && type.mime === 'image/jpeg') {
96
- processJPG(data, bits, method, cb);
97
- }
98
- else if (ext === 'webp' && type.mime === 'image/webp') {
99
- processWebp(data, bits, method, cb);
100
- }
101
- else {
102
- cb(new Error(`Unrecognized file extension, mime type or mismatch, ext: ${ext} / mime: ${type.mime}`));
103
- }
104
- }
105
- else {
106
- if (process.env.verbose)
107
- console.warn('No file extension found, attempting mime typing.');
108
- if (type.mime === 'image/png') {
109
- processPNG(data, bits, method, cb);
110
- }
111
- else if (type.mime === 'image/jpeg') {
112
- processJPG(data, bits, method, cb);
113
- }
114
- else if (type.mime === 'image/webp') {
115
- processWebp(data, bits, method, cb);
116
- }
117
- else {
118
- cb(new Error(`Unrecognized mime type: ${type.mime}`));
119
- }
120
- }
121
- }).catch((err) => {
122
- cb(err);
123
- });
124
- };
125
- const fetchRemoteImage = (remoteSrc) => __awaiter(void 0, void 0, void 0, function* () {
126
- if (fetch && typeof fetch !== 'function') {
127
- cb(new Error('Global fetch API is not available. Node.js 18+ is required.'));
128
- return;
129
- }
130
- const requestUrl = typeof remoteSrc === 'string' ? remoteSrc : remoteSrc.url;
131
- if (!requestUrl) {
132
- cb(new Error('No URL provided for remote image.'));
133
- return;
134
- }
135
- let init;
136
- if (typeof remoteSrc !== 'string') {
137
- init = Object.assign({}, remoteSrc);
138
- delete init.url;
139
- delete init.encoding;
140
- }
141
- try {
142
- const response = yield fetch(requestUrl, init);
143
- if (!response || !response.ok) {
144
- const status = response ? `${response.status} ${response.statusText}` : 'Unknown status';
145
- throw new Error(`Failed to fetch image. HTTP status: ${status}`);
146
- }
147
- const arrayBuffer = yield response.arrayBuffer();
148
- const buffer = buffer_1.Buffer.from(arrayBuffer);
149
- let pathname = '';
150
- try {
151
- const url = new url_1.URL(response.url || requestUrl);
152
- pathname = url.pathname;
153
- }
154
- catch (err) {
155
- pathname = '';
156
- }
157
- checkFileType(pathname, buffer);
158
- }
159
- catch (error) {
160
- cb(error);
161
- }
162
- });
163
- const handleReadFile = (err, res) => {
164
- if (err) {
165
- cb(new Error(err));
166
- return;
167
- }
168
- checkFileType(src, res);
169
- };
170
- // check source
171
- // is source assigned
172
- if (src === undefined) {
173
- cb(new Error('No image source provided'));
174
- return;
46
+ const getDecoder = async ({ data, name, mime }) => {
47
+ const type = mime ?? (await fileTypeFromBuffer(data))?.mime;
48
+ if (!type) {
49
+ throw new Error('Mime type not found');
175
50
  }
176
- // is src url or file
177
- if (typeof src === 'string' && (src.indexOf('http') === 0 || src.indexOf('https') === 0)) {
178
- // url
179
- fetchRemoteImage(src);
51
+ const decoder = decoders.get(type);
52
+ const ext = name ? path.extname(name).slice(1).toLowerCase() : '';
53
+ if (ext) {
54
+ if (!decoder?.extensions.includes(ext)) {
55
+ throw new Error(`Unrecognized file extension, mime type or mismatch, ext: ${ext} / mime: ${type}`);
56
+ }
57
+ return decoder;
180
58
  }
181
- else if (typeof src !== 'string' && isBufferObject(src)) {
182
- // image buffers
183
- checkFileType(src.name, src.data);
59
+ if (process.env.VERBOSE)
60
+ console.warn('No file extension found, attempting mime typing.');
61
+ if (!decoder) {
62
+ throw new Error(`Unrecognized mime type: ${type}`);
184
63
  }
185
- else if (typeof src !== 'string' && isUrlRequestObject(src)) {
186
- // Request Object
187
- fetchRemoteImage(src);
64
+ return decoder;
65
+ };
66
+ /**
67
+ * Create a perceptual hash of an image.
68
+ *
69
+ * @param src A file path, an http(s) URL, a Buffer, a `BufferObject` or a `UrlRequestObject`.
70
+ * @param bits The number of bits in a row. The more bits, the more unique the hash.
71
+ * @param precise `true` for the precise but slower algorithm, `false` for the quick one.
72
+ * @returns The hash as a hex string.
73
+ */
74
+ export const imageHash = async (src, bits = 16, precise = true) => {
75
+ if (src == null) {
76
+ throw new TypeError('No image source provided');
188
77
  }
189
- else {
190
- // file
191
- fs_1.default.readFile(src, handleReadFile);
78
+ if (!Number.isInteger(bits) || bits <= 0) {
79
+ throw new TypeError(`bits must be a positive integer, received: ${String(bits)}`);
192
80
  }
81
+ const image = await loadImage(src);
82
+ const decoder = await getDecoder(image);
83
+ return blockhash(decoder.decode(image.data), bits, precise ? 2 : 1);
193
84
  };
194
- exports.imageHash = imageHash;
195
85
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,SAAS,MAAM,iBAAiB,CAAC;AA8BxC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAkB;IACxC,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7E,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACpF,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;CAC9E,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAExE,MAAM,cAAc,GAAG,CAAC,GAAW,EAAuB,EAAE,CAAC,CAC3D,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAC3C,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAA2B,EAAE,CAAC,CACnE,KAAK,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAClE,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EAAE,GAA8B,EAAwB,EAAE;IAChF,sFAAsF;IACtF,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAEhF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EAAE,GAAgB,EAAwB,EAAE;IACjE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAe,EAAoB,EAAE;IAC/E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,4DAA4D,GAAG,YAAY,IAAI,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC1F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,GAAgB,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAmB,EAAE;IAC9F,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,8CAA8C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,31 @@
1
1
  {
2
2
  "name": "image-hash",
3
- "version": "7.0.1",
3
+ "version": "8.0.1",
4
4
  "description": "Create a hash from an image",
5
- "main": "lib/index.js",
6
- "types": "lib/index.d.ts",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./lib/index.d.ts",
9
+ "default": "./lib/index.js"
10
+ }
11
+ },
12
+ "main": "./lib/index.js",
13
+ "types": "./lib/index.d.ts",
7
14
  "files": [
8
15
  "lib"
9
16
  ],
17
+ "engines": {
18
+ "node": ">=22.12.0"
19
+ },
20
+ "packageManager": "pnpm@10.34.9",
21
+ "scripts": {
22
+ "build": "tsc -p tsconfig.build.json",
23
+ "typecheck": "tsc",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "lint": "eslint .",
27
+ "lint:fix": "eslint . --fix"
28
+ },
10
29
  "repository": {
11
30
  "type": "git",
12
31
  "url": "git+https://github.com/danm/image-hash.git"
@@ -25,26 +44,20 @@
25
44
  "homepage": "https://github.com/danm/image-hash#readme",
26
45
  "dependencies": {
27
46
  "@cwasm/webp": "^0.1.5",
28
- "file-type": "^21.0.0",
29
- "jpeg-js": "^0.4.0",
47
+ "file-type": "^22.2.0",
48
+ "jpeg-js": "^0.4.4",
30
49
  "pngjs": "^7.0.0"
31
50
  },
32
51
  "devDependencies": {
33
- "@types/node": "^24.5.2",
34
- "@vitest/coverage-v8": "^3.2.4",
35
- "eslint": "^9.36.0",
36
- "@types/pngjs": "^6.0.1",
37
- "eslint-config-airbnb-typescript": "^18.0.0",
38
- "eslint-config-airbnb-base": "^15.0.0",
39
- "eslint-plugin-import": "^2.25.4",
40
- "typescript": "^5.9.2",
41
- "vitest": "^3.2.4"
42
- },
43
- "scripts": {
44
- "test": "vitest run",
45
- "test:watch": "vitest",
46
- "build": "tsc",
47
- "lint": "eslint src/*.ts",
48
- "lint:fix": "eslint src/*.ts --fix"
52
+ "@eslint/js": "^10.0.1",
53
+ "@stylistic/eslint-plugin": "^5.10.0",
54
+ "@types/node": "^22.20.5",
55
+ "@types/pngjs": "^6.0.5",
56
+ "@vitest/coverage-v8": "^5.0.5",
57
+ "eslint": "^10.13.0",
58
+ "globals": "^17.13.0",
59
+ "typescript": "~6.0.3",
60
+ "typescript-eslint": "^8.72.0",
61
+ "vitest": "^5.0.5"
49
62
  }
50
- }
63
+ }