2017-02-27 4 views
2

Ich benutze zoomtopoint und zoome zum Objekt. aber nicht mit Hintergrund arbeiten. Ich möchte das Objekt und den Hintergrund vergrößern. Wie kann ich ?FabricJS - ZoomToPoint arbeitet nicht mit backgroundImage

Beispiel: Objektgröße: 100x100 nicht zoomen. object size : 100x100 not zoom. nach Zoom Objektgröße: 100x100 after zoom object size :100x100

nach Zoom und das Gitter blieben gleich.

Zoom Ereignis

document.addEventListener('wheel', function(event) { 
     var evt = window.event || event; 
     var delta = evt.detail? evt.detail*(-120) : evt.wheelDelta; 
     var curZoom = canvas.getZoom(); 
     var newZoom = curZoom + delta/4000; 
     var x = event.offsetX; 
     var y = event.offsetY; 
     canvas.zoomToPoint({ x: x, y: y }, newZoom); 
     if(event != null)event.preventDefault(); 
     return false; 
     canvas.calcOffset(); 
    }, false); 

Netzcode:

canvas.setBackgroundColor({source: src, repeat: 'repeat'}, canvas.renderAll.bind(canvas), function() { 
     canvas.renderAll(); 
     proceed(); 
    }); 

eDIT

#canvas-background { display: inline-block; position: absolute; top: 0; right: 0; } 

aber i dont CSS verwenden.

Hintergrundbild

Grid 50x50

Danke

Sorry, kann ich nicht gut Englisch sprechen.

+0

Wenn es sich um den canvas.style.background handelt, auf den Sie sich beziehen, dann ist es kein Teil der Canvas-2D-API und erfordert DOM/CSS-Transformationen. Nicht etwas, das FabricJS tut. Sie müssen den Hintergrund als ein Objekt zu Fabric hinzufügen, so dass es in den Zoom einbezogen werden kann. – Blindman67

+0

Ich denke, Sie sprechen über das Hinzufügen eines Hintergrundbildes als Bildobjekt. – forguta

+0

Ja. Ich weiß nicht, ob Fabric es Ihnen erlaubt, das Bild als wiederholbar zu setzen, aber die 2D API lässt Sie ein Muster über eine Bitmap setzen. Wenn mit Fabric ein Muster erstellt werden kann, erstellen Sie mithilfe der Hintergrund-Bitmap ein Muster. Auf diese Weise können Sie es wiederholbar haben. – Blindman67

Antwort

0

Relevanter Code ist unten (und der Rest ist in der JSFiddle), beachten Sie die Canvas-Größe und CSS-Container-Trick verwendet, um das Herauszoomen zu ermöglichen.

Beispiel: Objektgröße: 100x100 nicht zoomen.

fabricjs canvas grid not zoom

nach Zoom Objektgröße: 100x100

fabricjs canvas grid zoom

nach Zoom und das Gitter ist nicht mehr das gleiche.

fabric.Image.fromURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAADLSURBVFhH7ZnBCoMwEET9/68URBHSNj0UolFoI+aQickKlT05jz0MGQIPkb2kadu3ta42ff/MTtLRazct55bajOMjO0lHr920vnWMMTGV0GuphVALoRaiqNV1dq4TLsdUIrTe+z0fw+ndmEo0w/D61AmXYyqh1179WjGVuNLyl0eohVALuZ8Wtzwgt9zyiNxSC6EWQi1EUYtbHpBbbnlEbqmFUAuhFqKoxS0PyC23PCK31EKohVAL0dXK3vLSOX0TnKZ1z8fw/3uiW37L27QIZwrV4gAAAABJRU5ErkJggg==', function(img) { 
    var patternSourceCanvas = new fabric.StaticCanvas(); 
    patternSourceCanvas.add(img); 
    var pattern = new fabric.Pattern({ 
    source: function() { 
     patternSourceCanvas.setDimensions({ 
     width: img.getWidth(), 
     height: img.getHeight() 
     }); 
     return patternSourceCanvas.getElement(); 
    }, 
    repeat: 'repeat' 
    }); 
    var background = new fabric.Rect({ 
    width: canvas.getWidth(), 
    height: canvas.getHeight(), 
    fill: pattern, 
    selectable: false 
    }); 
    canvas.add(background, rectangle); 
    canvas.renderAll(); 
}); 

Hier ist ein Arbeits JSFiddle, https://jsfiddle.net/rekrah/86t2b8bs/.

Hoffe, das hilft.

UPDATE:

@forguta wollte auch Objekte, um sicherzustellen, nicht hinter dem Hintergrund lief, wenn sendToBack() ausgeführt wurde. Es wurde ein "wiederholtes" Hintergrundbild in ein Bild umgewandelt, so dass setBackgroundImage() verwendet werden konnte (die Bildgröße wurde nur auf 64K erhöht und ich bin mir sicher, dass sie weiter komprimiert werden könnte).

fabricjs canvas grid not zoom send to back

Einfachere Code:

canvas.setBackgroundImage('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACcQAAAnECAIAAAChEWJqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QMDDwYflNda9wAAIABJREFUeNrs2TGO67qWhlHSotSFm7z5z+4NoQsoXJbFs8HObYoGbJxmslYk4JfgD053/u9///............', canvas.renderAll.bind(canvas), { 
    // Needed to position backgroundImage at 0/0 
    originX: 'left', 
    originY: 'top' 
}); 

Hier ist eine aktualisierte Arbeits JSFiddle, https://jsfiddle.net/rekrah/u0srdsdr/.

+0

Ja, ich habe das auch versucht. Aber ich möchte nicht, dass der Hintergrund in getObjects() kommt. Wenn ich die Objekte, die ich erstelle, mit sendtoBack() an die Rückseite sende, verschwinden die Objekte. Wenn Sie eine Meinung dazu haben, kann ich es verwenden. Nochmals vielen Dank für Ihre Hilfe, @TimHarker. :) – forguta

+0

@forguta Ich habe meine Antwort oben aktualisiert. Ich glaube, das ist deine einfachste Möglichkeit. Es gibt eine andere Option, mit der ich herumgespielt habe, die CSS als Hintergrundbild verwendet, aber es würde etwas Arbeit erfordern, es skalieren zu lassen und insync zu zoomen. mit dem Skalieren und Zoomen ('canvas.zoomToPoint()') der Leinwand - aber ich glaube, es wäre machbar. –

+0

Ich bin Ihnen dankbar. Es funktioniert :) – forguta