fabric.js Größe Leinwand auf den Bildschirm passt
Ich bin derzeit auf der Entwicklung einer Anwendung auf einem mobilen Gerät (android und iPhone) mit ionic und cordova. Ich möchte ein Bild zu Bearbeiten. Ich benutze fabric.js Bibliothek zu tun. Fabric.js konvertiert ein Bild und andere Gegenstände in die Leinwand. Dann füge ich ein Bild auf die Leinwand (Aufkleber) und exportieren Sie es als Bild(dataURL). Also die Größe der Leinwand ist wirklich wichtig, denn es ist ein Qualitäts-Faktor (exportieren eines Bilds, basierend auf kleinen Leinwand wird das Ergebnis in schlechter Qualität). Die Leinwand hat eine Größe von 607*1080 pixel (je nach Gerät, nahm das Foto). Ich möchte, um es zu passen in den Bildschirm, ohne Qualität zu verlieren (wie unten erklärt wird, kann ich nicht die Größe der Leinwand, ohne Qualität zu verlieren).
Versuchte ich 3 Ideen, aber niemand hat gearbeitet.
- Resize canvas : Ergebnis in Qualität verloren (Bild exportiert werden canvas Größe)
- Anpassen viewport : cordova nicht erlaubt zu ändern, den viewport auf dem mobilen Gerät. Es ist ein workaround, aber es wird brechen mein design (sehr kleine navbar kleiner", ...)
- Verwenden CSS3-zoom-Eigenschaften : Es funktioniert wie ein Charme auf dem desktop, aber es ist ein event-mapping-problem auf einem mobilen Gerät (ich habe nicht versucht, auf ios aber das problem passiert auf android Webview). Event-mapping ist nicht gezoomt. Die Leinwand wird heraus gezoomt, aber es ist unmöglich für die Interaktion mit canvas-Elemente. Wenn ein canvas-element (Aufkleber) befindet sich bei x:100 y:100, wenn ich den zoom-Eigenschaft auf 0,5, wird das element Lage bei (50,50) und nicht mehr bei (100,100). Gibt es eine Möglichkeit das zu korrigieren das event-mapping je nach zoom-Eigenschaft der android webview?
Ich weiß nicht, ob es andere Möglichkeiten gibt, das zu tun, aber ich bin stucked mit diesem Problem seit 3 Tagen und ich habe verbringen viel Zeit in Foren, fabricjs doc und google und ich keine funktionierende Lösung oder etwas anderes, dass mir helfen kann.
EDIT: Es gibt 2 funktionierende Lösung unten. Check meine Antwort, um zu sehen, wie man das mit css.
- Ich Laufe in ähnliche Probleme mal vor. Ich denke, Sie sollten kopieren fabric.js Berechnungen die Berechnungen für die Ereignisse.....
- viele Male ist es einfach besser, auf code, den eigenen Weg, als zu versuchen, zu verwenden, verpackt Bibliotheken überhaupt
- Ich habe keine Zeit zu schreiben eine lib, implementieren alle functionnalities enthalten fabris.js. Ich benutze eine Menge von functionnalities dieser Bibliothek, und es würde zu viel Zeit, um alles neu von Grund auf.
- Würden Sie probabily Ende schreiben, eine Bibliothek und dann entscheiden, es zu teilen mit Menschen. Und jemand wird noch die Frage über die Bibliothek.
Du musst angemeldet sein, um einen Kommentar abzugeben.
1. Verwenden Sie css, um Ihr die richtige Auflösung für die Leinwand:
css:
Vorteile:
Nachteile:
2. Re-Größe der Leinwand, um die exakte dimension (Auflösung), wenn Sie brauchen, um zu senden, und erhalten dann das Bild generiert
Nur in der Größe Ihrer Leinwand am Fenster in der Größe (responsive canvas) und wenn Sie brauchen, um zu exportieren, um die genaue dimension, die Sie brauchen, um wieder zu der Größe Ihrer Leinwand zu exakten pixel-Auflösung, oder erstellen Sie eine andere Leinwand versteckt.
diesem Beispiel ist die 1:1-ration Leinwand (Sie müssen, um das Seitenverhältnis auf die Leinwand und Objekte innen):
Bei submit export-canvas-Daten re-Größe der Leinwand, um die gewünschte Auflösung, voila:
Es ist nicht eine große Sache mit den Rationen unterscheiden sich dann 1:1, die Sie benötigen, um zu berechnen, Mehrspieleraction für die Höhe als gut, leicht zu verstehen-Verhältnis: http://andrew.hedges.name/experiments/aspect_ratio/
Ich gefunden habe, einen trick zu tun, dass die zimmerreserviereung, ohne das kopieren der Leinwand. Diese Lösung ist wirklich die css zoom Eigenschaft, aber die Ereignisse sind handle richtig.
Dies ist ein Beispiel zum anzeigen des canvas-Bereichs die Hälfte seiner Größe: