2 changed files with 71 additions and 0 deletions
@ -0,0 +1,34 @@ |
|||||||
|
import Effect from './Effect.js'; |
||||||
|
|
||||||
|
export default class BlendEffect extends Effect { |
||||||
|
constructor(options = {}) { |
||||||
|
super(options); |
||||||
|
this.setDefaults({ |
||||||
|
blendMode: "screen", |
||||||
|
opacity: 1.0 |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
apply(ctx, video, params = {}) { |
||||||
|
if (!this.enabled) return; |
||||||
|
|
||||||
|
this.beforeApply(ctx, video, params); |
||||||
|
|
||||||
|
// Retrieve blend mode and opacity, defaulting to "screen" and 1.0
|
||||||
|
const blendMode = this.getParam("blendMode", params.blendMode); |
||||||
|
const opacity = this.getParam("opacity", params.opacity); |
||||||
|
|
||||||
|
// Set blend mode and opacity
|
||||||
|
ctx.globalCompositeOperation = blendMode; |
||||||
|
ctx.globalAlpha = opacity; |
||||||
|
|
||||||
|
// Draw the video frame onto the canvas
|
||||||
|
ctx.drawImage(video, 0, 0, ctx.canvas.width, ctx.canvas.height); |
||||||
|
|
||||||
|
// Reset to default values for further drawing
|
||||||
|
ctx.globalCompositeOperation = "source-over"; |
||||||
|
ctx.globalAlpha = 1.0; |
||||||
|
|
||||||
|
this.afterApply(ctx, video, params); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,37 @@ |
|||||||
|
import Effect from './Effect.js'; |
||||||
|
|
||||||
|
export default class ScaleEffect extends Effect { |
||||||
|
constructor(options = {}) { |
||||||
|
super(options); |
||||||
|
this.setDefaults({ |
||||||
|
scaleMode: "fit" // Scale mode, e.g., "fit" or "fill"
|
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
apply(ctx, video, params = {}) { |
||||||
|
if (!this.enabled) return; |
||||||
|
|
||||||
|
this.beforeApply(ctx, video, params); |
||||||
|
|
||||||
|
const scaleMode = this.getParam("scaleMode", params.scaleMode); |
||||||
|
|
||||||
|
// Determine the scale to either fit or fill the canvas
|
||||||
|
let scale; |
||||||
|
if (scaleMode === "fill") { |
||||||
|
scale = Math.min(ctx.canvas.width / video.videoWidth, ctx.canvas.height / video.videoHeight); |
||||||
|
} else { // Default to "fit" mode
|
||||||
|
scale = Math.max(ctx.canvas.width / video.videoWidth, ctx.canvas.height / video.videoHeight); |
||||||
|
} |
||||||
|
|
||||||
|
// Calculate scaled dimensions and offset for centering
|
||||||
|
const scaledWidth = video.videoWidth * scale; |
||||||
|
const scaledHeight = video.videoHeight * scale; |
||||||
|
const offsetX = (ctx.canvas.width - scaledWidth) / 2; |
||||||
|
const offsetY = (ctx.canvas.height - scaledHeight) / 2; |
||||||
|
|
||||||
|
// Draw the scaled video onto the canvas
|
||||||
|
ctx.drawImage(video, offsetX, offsetY, scaledWidth, scaledHeight); |
||||||
|
|
||||||
|
this.afterApply(ctx, video, params); |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue