coomdev
2 years ago
13 changed files with 3474 additions and 130 deletions
@ -1,3 +1,23 @@ |
|||
{ |
|||
"typescript.tsdk": "node_modules/typescript/lib" |
|||
"typescript.tsdk": "node_modules/typescript/lib", |
|||
"files.exclude": { |
|||
"**/dist": true, |
|||
"**/node_modules": true, |
|||
"**/*.png": true, |
|||
"**/*.html": true, |
|||
"**/*.c": true, |
|||
"**/*~": true, |
|||
"**/*.jpg": true, |
|||
"**/*.gif": true, |
|||
"**/*.exe": true, |
|||
"**/*.cs": true, |
|||
"**/*.out": true, |
|||
"**/*.zip": true, |
|||
"**/ext": true, |
|||
"**/*.mp4": true, |
|||
"**/*.webm": true, |
|||
"**/yarn.lock": true, |
|||
"**/out": true, |
|||
"**/*.data": true |
|||
} |
|||
} |
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -0,0 +1,68 @@ |
|||
const median = (data: number[]) => { |
|||
const mdarr = data.slice(0); |
|||
mdarr.sort((a, b) => a - b); |
|||
if (mdarr.length % 2 === 0) |
|||
return (mdarr[mdarr.length / 2 - 1] + mdarr[mdarr.length / 2]) / 2.0; |
|||
return mdarr[Math.floor(mdarr.length / 2)]; |
|||
}; |
|||
|
|||
const translate_blocks_to_bits = function (blocks: number[], pixels_per_block: number) { |
|||
const half_block_value = pixels_per_block * 256 * 3 / 2; |
|||
const bandsize = blocks.length / 4; |
|||
|
|||
// Compare medians across four horizontal bands
|
|||
for (let i = 0; i < 4; i++) { |
|||
const m = median(blocks.slice(i * bandsize, (i + 1) * bandsize)); |
|||
for (let j = i * bandsize; j < (i + 1) * bandsize; j++) { |
|||
const v = blocks[j]; |
|||
blocks[j] = Number(v > m || (Math.abs(v - m) < 1 && m > half_block_value)); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
const bits_to_hexhash = (bitsArray: number[]) => { |
|||
const hex = []; |
|||
for (let i = 0; i < bitsArray.length; i += 4) { |
|||
const nibble = bitsArray.slice(i, i + 4); |
|||
hex.push(parseInt(nibble.join(''), 2).toString(16)); |
|||
} |
|||
|
|||
return hex.join(''); |
|||
}; |
|||
|
|||
export const bmvbhash_even = (data: { |
|||
width: number; |
|||
height: number; |
|||
data: Uint8Array; |
|||
}, bits: number) => { |
|||
const blocksize_x = Math.floor(data.width / bits); |
|||
const blocksize_y = Math.floor(data.height / bits); |
|||
|
|||
const result = []; |
|||
|
|||
for (let y = 0; y < bits; y++) { |
|||
for (let x = 0; x < bits; x++) { |
|||
let total = 0; |
|||
|
|||
for (let iy = 0; iy < blocksize_y; iy++) { |
|||
for (let ix = 0; ix < blocksize_x; ix++) { |
|||
const cx = x * blocksize_x + ix; |
|||
const cy = y * blocksize_y + iy; |
|||
const ii = (cy * data.width + cx) * 4; |
|||
|
|||
const alpha = data.data[ii + 3]; |
|||
if (alpha === 0) { |
|||
total += 765; |
|||
} else { |
|||
total += data.data[ii] + data.data[ii + 1] + data.data[ii + 2]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
result.push(total); |
|||
} |
|||
} |
|||
|
|||
translate_blocks_to_bits(result, blocksize_x * blocksize_y); |
|||
return bits_to_hexhash(result); |
|||
}; |
Loading…
Reference in new issue