@scandit/web-datacapture-core
Version:
Scandit Data Capture SDK for the Web
1 lines • 5.73 kB
JavaScript
import {a}from'./chunk-XR65N6EG.js';var g=class{constructor(a){this.options=a;}get quality(){return this.options.quality}async convertToJpeg(a$1,e){try{let{width:t,height:r,planes:s}=this.validateAndExtractImageData(a$1);this.prepareCanvas(t,r);let o=this.processImageData(a$1,s,t,r);return await this.convertToJpegBytes(o,e)}catch(t){throw a.warn(`Failed to convert image to JPEG: ${t}`),t instanceof Error?t:new Error("Failed to convert image to JPEG")}}validateAndExtractImageData(a$1){let e=a$1.getWidth(),t=a$1.getHeight(),r=a$1.getPlanes();if(e<=0||t<=0)throw a.warn(`Invalid image dimensions: ${e}x${t}`),new Error(`Invalid image dimensions: ${e}x${t}`);if(!r||r.length===0)throw a.warn("ImageBuffer has no planes"),new Error("ImageBuffer has no planes");return {width:e,height:t,planes:r}}prepareCanvas(a,e){if(!this.ensureCanvas(a,e))throw new Error("Failed to create OffscreenCanvas");if(!this.canvas||!this.context)throw new Error("Canvas or context not properly initialized")}processImageData(a,e,t,r){let s=this.createImageDataFromBuffer(a,e,t,r);if(s===null)throw new Error("Failed to create ImageData");return this.validateImageData(s,t,r),s}validateImageData(a$1,e,t){var r;if(a$1.width!==e||a$1.height!==t)throw a.warn(`ImageData dimensions mismatch: expected ${e}x${t}, got ${a$1.width}x${a$1.height}`),new Error("ImageData dimensions mismatch");if(!a$1.data||a$1.data.length!==e*t*4)throw a.warn(`ImageData has invalid data length: expected ${e*t*4}, got ${((r=a$1.data)==null?void 0:r.length)||0}`),new Error("ImageData has invalid data length")}async convertToJpegBytes(a$1,e){if(!this.context||!this.canvas)throw new Error("Canvas or context not available");try{this.context.putImageData(a$1,0,0);}catch(o){throw a.warn(`Failed to put image data on canvas: ${o}`),new Error(`Failed to put image data on canvas: ${o}`)}let t=e!==0?this.applyRotation(this.canvas,e):this.canvas,r;try{r=await this.canvasToBlob(t);}catch(o){throw a.warn(`Failed to convert canvas to blob: ${o}`),new Error(`Failed to convert canvas to blob: ${o}`)}if(!r||r.size===0)throw a.warn("Canvas convertToBlob returned empty or null blob"),new Error("Failed to create JPEG blob");let s;try{s=await r.arrayBuffer();}catch(o){throw a.warn(`Failed to get array buffer from blob: ${o}`),new Error(`Failed to get array buffer from blob: ${o}`)}if(!s||s.byteLength===0)throw a.warn("Blob arrayBuffer returned empty or null buffer"),new Error("Failed to get array buffer from blob");return new Uint8Array(s)}ensureCanvas(a$1,e){try{return (!this.canvas||this.canvas.width!==a$1||this.canvas.height!==e)&&(this.canvas=this.getNewCanvas(a$1,e),this.context=this.canvas.getContext("2d")),this.context!==null}catch(t){return a.warn("Failed to create HTMLCanvasElement",t),false}}createImageDataFromBuffer(a$1,e,t,r){let s=new Set(e.map(o=>o.channel));try{if(this.isYUVFormat(s)){let n=a$1.toBitmap();return !n||n.length!==t*r*4?(a.warn(`Invalid bitmap data from toBitmap(): expected ${t*r*4} bytes, got ${(n==null?void 0:n.length)||0}`),null):new ImageData(new Uint8ClampedArray(n),t,r)}if(this.isRGBAFormat(s))return this.createImageDataFromRGBAPlanes(e,t,r);if(this.isRGBFormat(s))return this.createImageDataFromRGBPlanes(e,t,r);if(this.isGrayscaleFormat(s))return this.createImageDataFromGrayscalePlanes(e,t,r);a.warn(`Unknown image format with channels: ${Array.from(s).join(", ")}, falling back to toBitmap()`);let o=a$1.toBitmap();if(!o||o.length===0)return a.warn("toBitmap() returned empty or null data"),null;let l=o.length/(t*r);return l===4?new ImageData(new Uint8ClampedArray(o),t,r):(a.warn(`Unsupported format: ${l} bytes per pixel`),null)}catch(o){return a.warn(`Failed to create ImageData: ${o}`),null}}isYUVFormat(a){return a.has(0)&&a.has(1)&&a.has(2)}isRGBAFormat(a){return a.has(3)&&a.has(4)&&a.has(5)&&a.has(6)}isRGBFormat(a){return a.has(3)&&a.has(4)&&a.has(5)&&!a.has(6)}isGrayscaleFormat(a){return a.has(0)&&!a.has(1)&&!a.has(2)}createImageDataFromRGBAPlanes(a$1,e,t){let r=a$1.find(i=>i.channel===3),s=a$1.find(i=>i.channel===4),o=a$1.find(i=>i.channel===5),l=a$1.find(i=>i.channel===6);if(!r||!s||!o||!l)return a.warn("Missing RGBA planes"),null;let n=new Uint8ClampedArray(e*t*4);for(let i=0;i<t;i++)for(let c=0;c<e;c++){let u=(i*e+c)*4;n[u]=this.getPixelFromPlane(r,c,i),n[u+1]=this.getPixelFromPlane(s,c,i),n[u+2]=this.getPixelFromPlane(o,c,i),n[u+3]=this.getPixelFromPlane(l,c,i);}return new ImageData(n,e,t)}createImageDataFromRGBPlanes(a$1,e,t){let r=a$1.find(n=>n.channel===3),s=a$1.find(n=>n.channel===4),o=a$1.find(n=>n.channel===5);if(!r||!s||!o)return a.warn("Missing RGB planes"),null;let l=new Uint8ClampedArray(e*t*4);for(let n=0;n<t;n++)for(let i=0;i<e;i++){let c=(n*e+i)*4;l[c]=this.getPixelFromPlane(r,i,n),l[c+1]=this.getPixelFromPlane(s,i,n),l[c+2]=this.getPixelFromPlane(o,i,n),l[c+3]=255;}return new ImageData(l,e,t)}createImageDataFromGrayscalePlanes(a$1,e,t){let r=a$1.find(o=>o.channel===0);if(!r)return a.warn("Missing Y plane for grayscale"),null;let s=new Uint8ClampedArray(e*t*4);for(let o=0;o<t;o++)for(let l=0;l<e;l++){let n=(o*e+l)*4,i=this.getPixelFromPlane(r,l,o);s[n]=i,s[n+1]=i,s[n+2]=i,s[n+3]=255;}return new ImageData(s,e,t)}getPixelFromPlane(a,e,t){let r=Math.floor(e/(a.subsamplingX||1)),s=Math.floor(t/(a.subsamplingY||1)),o=a.rowStride,l=a.pixelStride,n=s*o+r*l,i=a.data;return n<i.length?i[n]:0}applyRotation(a,e){let t=e*Math.PI/180,r=e===90||e===270||e===-90||e===-270,s=r?a.height:a.width,o=r?a.width:a.height,l=this.getNewCanvas(s,o),n=l.getContext("2d");if(!n)throw new Error("Failed to get 2D context for rotated canvas");return n.translate(s/2,o/2),n.rotate(t),n.translate(-a.width/2,-a.height/2),n.drawImage(a,0,0),l}};g.JPEG_IMAGE_MIME_TYPE="image/jpeg";export{g as a};