diff --git a/README.md b/README.md
index 4157dd439..05b0d6398 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@ npm i @huggingface/transformers
Alternatively, you can use it in vanilla JS, without any bundler, by using a CDN or static hosting. For example, using [ES Modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), you can import the library with:
```html
```
@@ -155,7 +155,7 @@ Check out the Transformers.js [template](https://huggingface.co/new-space?templa
-By default, Transformers.js uses [hosted pretrained models](https://huggingface.co/models?library=transformers.js) and [precompiled WASM binaries](https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.1.0/dist/), which should work out-of-the-box. You can customize this as follows:
+By default, Transformers.js uses [hosted pretrained models](https://huggingface.co/models?library=transformers.js) and [precompiled WASM binaries](https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.1.1/dist/), which should work out-of-the-box. You can customize this as follows:
### Settings
diff --git a/docs/snippets/2_installation.snippet b/docs/snippets/2_installation.snippet
index 353d739c8..0ef9f7992 100644
--- a/docs/snippets/2_installation.snippet
+++ b/docs/snippets/2_installation.snippet
@@ -7,6 +7,6 @@ npm i @huggingface/transformers
Alternatively, you can use it in vanilla JS, without any bundler, by using a CDN or static hosting. For example, using [ES Modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), you can import the library with:
```html
```
diff --git a/docs/snippets/4_custom-usage.snippet b/docs/snippets/4_custom-usage.snippet
index d505f80e4..28a19fd93 100644
--- a/docs/snippets/4_custom-usage.snippet
+++ b/docs/snippets/4_custom-usage.snippet
@@ -1,6 +1,6 @@
-By default, Transformers.js uses [hosted pretrained models](https://huggingface.co/models?library=transformers.js) and [precompiled WASM binaries](https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.1.0/dist/), which should work out-of-the-box. You can customize this as follows:
+By default, Transformers.js uses [hosted pretrained models](https://huggingface.co/models?library=transformers.js) and [precompiled WASM binaries](https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.1.1/dist/), which should work out-of-the-box. You can customize this as follows:
### Settings
diff --git a/src/env.js b/src/env.js
index 287c98dfc..21d047457 100644
--- a/src/env.js
+++ b/src/env.js
@@ -26,7 +26,7 @@ import fs from 'fs';
import path from 'path';
import url from 'url';
-const VERSION = '3.1.0';
+const VERSION = '3.1.1';
// Check if various APIs are available (depends on environment)
const IS_BROWSER_ENV = typeof window !== "undefined" && typeof window.document !== "undefined";
diff --git a/src/utils/image.js b/src/utils/image.js
index d372cd0ac..f2f47821a 100644
--- a/src/utils/image.js
+++ b/src/utils/image.js
@@ -303,6 +303,46 @@ export class RawImage {
return this._update(newData, this.width, this.height, 4);
}
+ /**
+ * Apply an alpha mask to the image. Operates in place.
+ * @param {RawImage} mask The mask to apply. It should have a single channel.
+ * @returns {RawImage} The masked image.
+ * @throws {Error} If the mask is not the same size as the image.
+ * @throws {Error} If the image does not have 4 channels.
+ * @throws {Error} If the mask is not a single channel.
+ */
+ putAlpha(mask) {
+ if (mask.width !== this.width || mask.height !== this.height) {
+ throw new Error(`Expected mask size to be ${this.width}x${this.height}, but got ${mask.width}x${mask.height}`);
+ }
+ if (mask.channels !== 1) {
+ throw new Error(`Expected mask to have 1 channel, but got ${mask.channels}`);
+ }
+
+ const this_data = this.data;
+ const mask_data = mask.data;
+ const num_pixels = this.width * this.height;
+ if (this.channels === 3) {
+ // Convert to RGBA and simultaneously apply mask to alpha channel
+ const newData = new Uint8ClampedArray(num_pixels * 4);
+ for (let i = 0, in_offset = 0, out_offset = 0; i < num_pixels; ++i) {
+ newData[out_offset++] = this_data[in_offset++];
+ newData[out_offset++] = this_data[in_offset++];
+ newData[out_offset++] = this_data[in_offset++];
+ newData[out_offset++] = mask_data[i];
+ }
+ return this._update(newData, this.width, this.height, 4);
+
+ } else if (this.channels === 4) {
+ // Apply mask to alpha channel in place
+ for (let i = 0; i < num_pixels; ++i) {
+ this_data[4 * i + 3] = mask_data[i];
+ }
+ return this;
+ }
+ throw new Error(`Expected image to have 3 or 4 channels, but got ${this.channels}`);
+ }
+
/**
* Resize the image to the given dimensions. This method uses the canvas API to perform the resizing.
* @param {number} width The width of the new image. `null` or `-1` will preserve the aspect ratio.