Hallo Entwickler, ich hab aktuell ein Problem wo ich nicht weiter weiß.
Wie kann ich das Bild so drehen wie es im Bild ist?
Ich hab schon camera, canvas und matrix probiert aber nichts hat so richtig funktioniert.
Bitte helft mir
Hallo Entwickler, ich hab aktuell ein Problem wo ich nicht weiter weiß.
Wie kann ich das Bild so drehen wie es im Bild ist?
Ich hab schon camera, canvas und matrix probiert aber nichts hat so richtig funktioniert.
Bitte helft mir
Mit OpenGL als Textur auf eine Fläche zeichnen und diese drehen vielleicht…
Hey Marco,
ich hab jetzt einen relativ guten weg gefunden über Canvas den ich garnicht gewusst hab.
Aber ein kleines Problem gibt es trotzdem ich hab ein knick im Bild siehe Anhang.
Hier der Code Snipped wie ich das Bild anpasse.
public Bitmap rotateScreen(Bitmap screenshot) {
float[] mPoints = {
topLeftX, topLeftY,
topRightX, topRightY,
bottomLeftX, bottomLeftY,
bottomRightX, bottomRightY
};
Bitmap cs = Bitmap.createBitmap(frames.getWidth(), frames.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(cs);
canvas.drawBitmapMesh(screenshot, 1, 1, mPoints, 0, null, 0, null);
return cs;
}
Alles anzeigen
Der Knick scheint von oben links (topLeftX/topLeftY) nach unten rechts (bottomRightX/bottomRightY) zu gehen.
Kannst Du das Ganze mal mit einer vernünftigen Dummy-Grafik machen?
Beispielsweise von so einer Art Karopapier.
Erst einmal quadratisch und dann vielleicht noch in einem Rechteck.
Da lassen sich sicherlich bessere Annahmen zur Fehlerursache treffen.
Naja, ohne das Phone drum rum wäre ein bisschen schöner.
Okay, wenn ich mir das Resultat in Verbindung mit der Dokumentation so ansehe, dann sieht das 'richtig' aus…
Zitat von "Canvas.drawBitmapMesh(…)"A more general version of this method is drawVertices().
Zitat von "Canvas.drawVertices(…)"Draw the array of vertices, interpreted as triangles (based on mode).
Du nimmst ein 2D Bild von sagen wir 5,68cm Höhe und 3,20cm Breite.
Jetzt möchtest Du das auf sagen wir 4,75cm Höhe (links), 2,78cm Breite (oben), 5,32cm Höhe (rechts) und 3,02cm Breite (unten) skalieren.
Dein Ansatz macht Folgendes: aus den vier Punktpaaren schnibbelt es sich zwei Rechtecke und skaliert sie entsprechend.
Stumpf gesagt hast Du jetzt ein Dreieck mit spitzem 72° Winkel und einer Schenkellänge von 2,78cm x 5,32cm.
Sowie ein Dreieck mit einem stumpfen 98° Winkel und einer Schenkellänge von 3,02cm x 4,75cm.
Auf diese Dreiecke werden jetzt die ausgeschnittenen Dreiecke projiziert: 3,20 x 5,68 mit 90° auf 2,78 x 5,32 mit 72°; 3,20 x 5,68 mit 90° auf 3,02 x 4,75 mit 98°
Daher hast Du diesen Knick, der bei Linien stark auffallend sichtbar ist. (Andererseits hat eine solche Transformation bei reinen Farben wenig Sinn…)
Die von Dir benutzte Methode teilt Dein Mesh in flächenmäßig ungefähr gleich große Dreiecke und projiziert über jedes Dreieck einen Ausschnitt Deines Ursprungsbildes.
Das ist so eine Art simuliertes 3D, bei dem ja auch einzelne Texturen auf einzelne Dreiecksflächen gepackt werden. Und wie bei 3D gilt: je mehr und dadurch kleiner die Dreiecke, desto besser das Ergebnis.
Du könntest also dem Canvas einfach statt 4 Ecken (oben links, oben rechts, unten links, unten rechts) auch 9 Ecken geben (oben links, oben mitte, oben rechts, mitte links, mitte, mitte rechts, unten links, unten mitte, unten rechts). Du kannst das meinetwegen auch auf 64 Ecken aufblähen. Die Qualität wird immer besser, die Berechnungszeit immer höher.
Eine Alternative wäre natürlich, direkt ein OpenGL View mit einer entsprechend vorbereiteten Szene bereit zu stellen, auf der Du dann jeweils die Textur darstellst.
Fakt ist: einfach mal so lässt sich das nicht umsetzen.
Aaaahh okay, danke für die Erläuterung, ich werde es einfach mal mit mehr ecken probieren da das OpenGL ein bisschen Kompliziert aussieht und ich nicht so recht weiß wie man dann dieses Bild speichert
Kurze frage am Rande mit dem Koordinaten, ich hab die jetzt so angeordnert ist das soweit korrekt? Weil ich wüsste jetzt nicht wie ich die anders anordnen soll Ich bekomme da solch ein gebilde raus
Die Anordnung scheint gemäß Dokumentation (von oben links nach unten rechts) richtig.
Interessant müssten die Werte sein.
das sind die einzelnen Werte (ja das ist sehr große koordinaten soll ja auch fullhd sein das bild )
float topLeftX, topLeftY, topMidX, topMidY, topRightX, topRightY,
midLeftX, midLeftY, midMidX, midMidY, midRightX, midRightY,
bottomLeftX, bottomLeftY, bottomMidX, bottomMidY, bottomRightX, bottomRightY;
topLeftX = 377;
topLeftY = 630;
topMidX = 800;
topMidY = 555;
topRightX = 1197;
topRightY = 486;
midLeftX = 377;
midLeftY = 1440;
midMidX = 800;
midMidY = 1440;
midRightX = 1197;
midRightY = 1440;
bottomLeftX = 377;
bottomLeftY = 2246;
bottomMidX = 800;
bottomMidY = 2321;
bottomRightX = 1197;
bottomRightY = 2390;
Alles anzeigen
Davon ausgehend, dass oben links 0,0 ist, sieht das zumindest richtig aus…
Ich würde jetzt einmal nur einzelne Viertel anzeigen, also zuerst topLeftX,topLeftY;topMidX,topMidY;midLeftX,mitLeftY;midMidX,midMidY;
Dann mal gucken, was daraus gemacht wird.
Dann das Viertel topMid->topRight->midMid->midRight und so weiter.
Sieht auf jeden Fall richtig aus.
Nun mal die Hälften probieren: obere Hälfte, untere Hälfte, linke Hälfte, rechte Hälfte, aber mit den jeweils 6 Koordinaten.
Also für die obere Hälfte:
topLeftX, topLeftY;
topMidX, topMidY;
topRightX, topRightY;
midLeftX, midLeftY;
midMidX, midMidY;
midRightX, midRightY;
So hab es jetzt mit
topLeftX, topLeftY;
topMidX, topMidY;
topRightX, topRightY;
midLeftX, midLeftY;
midMidX, midMidY;
midRightX, midRightY;
und
midLeftX, midLeftY,
midMidX, midMidY,
midRightX, midRightY,
bottomLeftX, bottomLeftY,
bottomMidX, bottomMidY,
bottomRightX, bottomRightYProbiert das kam raus
Ausgezeichnet, da läuft also irgendwas schief. =)
Offenbar hat die Doku irgendwo gelogen. Es sieht für mich so aus, als würde Deine Eingabe nicht von oben links nach unten rechts aufgelöst, sondern total willkürlich.
Snippet 1 geht von topLeft -> topMid -> midLeft;
Snippet 2 geht von topMid -> topRight ->midLeft;
Alle Weiteren werden stumpf ignoriert.
Zurück zur Dokumentation:
Zitatverts Array of x,y pairs, specifying where the mesh should be drawn. There must be at least (meshWidth+1) * (meshHeight+1) * 2 + vertOffset values in the array
Das ist gegeben. Also weiter im Text.
ZitatmeshWidth The number of columns in the mesh. Nothing is drawn if this is 0
meshHeight The number of rows in the mesh. Nothing is drawn if this is 0
Das bedeutet wohl, Du musst die Angaben in Breiten und Höhe gemäß Deiner Koordinaten anpassen.
// also statt
canvas.drawBitmapMesh(screenshot, 1, 1, mPoints, 0, null, 0, null);
// Bedeutet: erzeuge mir eine Zeile und eine Spalte; also ein einziges Feld.
// lieber
canvas.drawBitmapMesh(screenshot, 2, 2, mPoints, 0, null, 0, null);
// Bedeutet: erzeuge mir zwei Zeilen und zwei Spalten; also vier Felder.
Je detaillierter Du das Bild darstellen willst, desto mehr Zeilen und Spalten musst Du auch zusätzlich zu den Punkten definieren.
Yeah danke Marco,
funktioniert soweit
ist bloß welliger geworden das heißt noch feiner werden.
Gern.
Irgendwann steht der Rechenaufwand aber vermutlich in keinem Verhältnis mehr zum Resultat.
mmmh, ich weiß aber das Problem ist ich hab echt kein Plan wie das mit OpenGL funktionieren soll eine Bitmap zu erstellen
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!