webimage.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import BaseDecoder from './basedecoder.js';
  2. /**
  3. * class WebImageDecoder
  4. *
  5. * This decoder uses the browsers image decoding facilities to read image
  6. * formats like WebP when supported.
  7. */
  8. export default class WebImageDecoder extends BaseDecoder {
  9. constructor() {
  10. super();
  11. if (typeof createImageBitmap === 'undefined') {
  12. throw new Error('Cannot decode WebImage as `createImageBitmap` is not available');
  13. } else if (typeof document === 'undefined' && typeof OffscreenCanvas === 'undefined') {
  14. throw new Error('Cannot decode WebImage as neither `document` nor `OffscreenCanvas` is not available');
  15. }
  16. }
  17. async decode(fileDirectory, buffer) {
  18. const blob = new Blob([buffer]);
  19. const imageBitmap = await createImageBitmap(blob);
  20. let canvas;
  21. if (typeof document !== 'undefined') {
  22. canvas = document.createElement('canvas');
  23. canvas.width = imageBitmap.width;
  24. canvas.height = imageBitmap.height;
  25. } else {
  26. canvas = new OffscreenCanvas(imageBitmap.width, imageBitmap.height);
  27. }
  28. const ctx = canvas.getContext('2d');
  29. ctx.drawImage(imageBitmap, 0, 0);
  30. // TODO: check how many samples per pixel we have, and return RGB/RGBA accordingly
  31. // it seems like GDAL always encodes via RGBA which does not require a translation
  32. return ctx.getImageData(0, 0, imageBitmap.width, imageBitmap.height).data.buffer;
  33. }
  34. }