-
Notifications
You must be signed in to change notification settings - Fork 184
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #194 from geotiffjs/web-images
Add support for WebP decompression via the browser
- Loading branch information
Showing
2 changed files
with
41 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import BaseDecoder from './basedecoder.js'; | ||
|
||
/** | ||
* class WebImageDecoder | ||
* | ||
* This decoder uses the browsers image decoding facilities to read image | ||
* formats like WebP when supported. | ||
*/ | ||
export default class WebImageDecoder extends BaseDecoder { | ||
constructor() { | ||
super(); | ||
if (typeof createImageBitmap === 'undefined') { | ||
throw new Error('Cannot decode WebImage as `createImageBitmap` is not available'); | ||
} else if (typeof document === 'undefined' && typeof OffscreenCanvas === 'undefined') { | ||
throw new Error('Cannot decode WebImage as neither `document` nor `OffscreenCanvas` is not available'); | ||
} | ||
} | ||
|
||
async decode(fileDirectory, buffer) { | ||
const blob = new Blob([buffer]); | ||
const imageBitmap = await createImageBitmap(blob); | ||
|
||
let canvas; | ||
if (typeof document !== 'undefined') { | ||
canvas = document.createElement('canvas'); | ||
canvas.width = imageBitmap.width; | ||
canvas.height = imageBitmap.height; | ||
} else { | ||
canvas = new OffscreenCanvas(imageBitmap.width, imageBitmap.height); | ||
} | ||
|
||
const ctx = canvas.getContext('2d'); | ||
ctx.drawImage(imageBitmap, 0, 0); | ||
|
||
// TODO: check how many samples per pixel we have, and return RGB/RGBA accordingly | ||
// it seems like GDAL always encodes via RGBA which does not require a translation | ||
|
||
return ctx.getImageData(0, 0, imageBitmap.width, imageBitmap.height).data.buffer; | ||
} | ||
} |