11import { Readable } from 'stream' ;
2+ import { createRequire } from 'module' ;
23import crypto from 'crypto' ;
34import sharp from 'sharp' ;
45import {
@@ -9,6 +10,9 @@ import {
910import brotli from 'brotli' ;
1011import { buffer } from 'stream/consumers' ;
1112
13+ const require_ = createRequire ( import . meta. url ) ;
14+ const { cv } = require_ ( 'opencv-wasm' ) ;
15+
1216/**
1317 * Computes MD5 and SHA1 hashes from a readable stream and resizes any image data.
1418 * @param stream Node.js readable stream (e.g., fs.createReadStream)
@@ -54,16 +58,29 @@ export async function computeHashesFromStream(
5458 }
5559
5660 if ( resize ) {
57- const resizer = sharp ( ) . resize ( 448 , 448 ) . raw ( { depth : 'char' } ) ;
58- stream . pipe ( resizer ) ;
59- const rgbData = await resizer . toBuffer ( ) ;
60- // Sharp outputs RGB format, but Athena expects BGR - swap R and B channels
61- data = Buffer . alloc ( rgbData . length ) ;
62- for ( let i = 0 ; i < rgbData . length ; i += 3 ) {
63- data [ i ] = rgbData [ i + 2 ] ; // B <- R
64- data [ i + 1 ] = rgbData [ i + 1 ] ; // G <- G
65- data [ i + 2 ] = rgbData [ i ] ; // R <- B
66- }
61+ const rawBuffer = await buffer ( stream ) ;
62+
63+ const decoded = await sharp ( rawBuffer )
64+ . removeAlpha ( )
65+ . raw ( { depth : 'uchar' } )
66+ . toBuffer ( { resolveWithObject : true } ) ;
67+
68+ const { data : rgbPixels , info } = decoded ;
69+
70+ const srcMat = new cv . Mat ( info . height , info . width , cv . CV_8UC3 ) ;
71+ srcMat . data . set ( rgbPixels ) ;
72+
73+ const dstMat = new cv . Mat ( 448 , 448 , cv . CV_8UC3 ) ;
74+ cv . resize ( srcMat , dstMat , new cv . Size ( 448 , 448 ) , 0 , 0 , cv . INTER_LINEAR ) ;
75+ srcMat . delete ( ) ;
76+
77+ const bgrMat = new cv . Mat ( 448 , 448 , cv . CV_8UC3 ) ;
78+ cv . cvtColor ( dstMat , bgrMat , cv . COLOR_RGB2BGR ) ;
79+ dstMat . delete ( ) ;
80+
81+ data = Buffer . from ( bgrMat . data ) ;
82+ bgrMat . delete ( ) ;
83+
6784 imageFormat = ImageFormat . IMAGE_FORMAT_RAW_UINT8_BGR ;
6885 } else {
6986 data = await buffer ( stream ) ;
0 commit comments