auf AndreaBogazzi Antwort zu erstellen, hier ist meine komplette Lösung, in der ich die _render Methode außer Kraft setzen. Jedes Mal, wenn ich ein Bild zu erstellen, füge ich ein „Sizemode“ Attribut es, die sagt _render, wie genau es zu malen:
fabric.Image.prototype._render = function(ctx, noTransform) {
/* This is the default behavior. I haven't modified anything in this part. */
let x, y, imageMargins = this._findMargins(), elementToDraw;
x = (noTransform ? this.left : -this.width/2);
y = (noTransform ? this.top : -this.height/2);
if (this.meetOrSlice === 'slice') {
ctx.beginPath();
ctx.rect(x, y, this.width, this.height);
ctx.clip();
}
if (this.isMoving === false && this.resizeFilters.length && this._needsResize()) {
this._lastScaleX = this.scaleX;
this._lastScaleY = this.scaleY;
elementToDraw = this.applyFilters(null, this.resizeFilters, this._filteredEl
|| this._originalElement, true);
}
else {
elementToDraw = this._element;
}
/* My changes begin here. */
if (elementToDraw && elementToDraw.naturalHeight > 0) {
if (this.sizeMode === BadgingImageSizeMode.CenterImage) {
drawCenterImage.apply(this, [ctx, elementToDraw, imageMargins, x, y]);
} else {
// Default _render behavior
ctx.drawImage(elementToDraw,
x + imageMargins.marginX,
y + imageMargins.marginY,
imageMargins.width,
imageMargins.height);
}
}
/* And they finish here. */
this._stroke(ctx);
this._renderStroke(ctx);
};
Die drawCenterImage Funktion I definiert haben, ist hier:
const drawCenterImage = function(ctx, elementToDraw, imageMargins, x, y) {
const sx = (elementToDraw.naturalWidth - this.width)/2;
const sy = (elementToDraw.naturalHeight - this.height)/2;
ctx.drawImage(elementToDraw,
sx,
sy,
imageMargins.width,
imageMargins.height,
x + imageMargins.marginX,
y + imageMargins.marginY,
imageMargins.width,
imageMargins.height);
};
Während dieser funktioniert zum Zentrieren von Bildern (wie meine ursprüngliche Frage), unterschiedliche Aufrufe von ctx.drawImage führen zu unterschiedlichen Effekten. Here is the documentation for the drawImage method.
Bitte geben Sie an, was Sie bisher erreicht haben. – Observer