Verhältnis von dargestelltem Bild und original Bild

  • Antworten:9
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 2.492

04.09.2014, 19:19:37 via Website

Hallo,

ich komm grad nicht weiter bei meiner Crop-Funktion.
Und zwar habe ich wie bei der normalen Android Crop Funktion ein Rechteck. Bekannt ist dabei der linke obere Punkte und der rechte untere Punkt und natürlich Breite und Höhe.
Wenn ich jetzt das Bild zurecht schneiden will mach ich das mit Bitmap.createBitmap(source, x, y, width, height);
Das Problem ist aber, dass ich dann nicht das bekomme was mit dem Rechteck eingerahmt war sondern etwas was in dem Rechteck nah rangezoomt ist.
Ich vermute, dass es daran liegt, dass das Bild z.B. 1500 Pixel breit ist aber es nur auf (bei mir) 480 Pixel dargestellt wird. Deswegen füge ich bei dem createBitmap(...) falsche Pixel - Zahlen ein.
Habt ihr eine Idee wie ich das lösen kann? Hab schon einiges probiert aber das es so angezeigt wird wie es soll habe ich noch nicht geschafft.

Antworten
Micha Roth
  • Forum-Beiträge: 26

05.09.2014, 02:09:34 via Website

Hey,

ich habe damit noch nie gearbeitet, deshalb nur eine Idee:
Du könntest das Bild vorher skalieren. Vermutlich liest du es in einem ImageView aus, denke ich mal?

Schau dir mal diesen Link an: skalieren mit bitmapfactory

Vielleicht wird das Problem damit gelöst.

Gruß von

Stirnraten

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

07.09.2014, 10:48:32 via Website

Aber wenn ich es skaliere ist ja auch die Qualität schlechter oder nicht?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.09.2014, 10:54:38 via Website

Eignetlich sollte das nicht der Fall sein.
Teste es doch einfach.
Dann siehst du ja was herauskommt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

07.09.2014, 11:02:31 via Website

Also das Bild auf die Größe des Bildschirms/ImageViews skalieren und dann wie vorher zuschneiden?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.09.2014, 11:04:40 via App

Meuner meinung nach achon.
Nur ob es funktioniert ist eine andere Sache.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

07.09.2014, 11:41:59 via Website

Ja scheint zu funktionieren, ob die Qualität darunter leidet kann ich so leider noch nicht sehen.
Danke erstmal euch beiden ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.09.2014, 12:31:35 via Website

Kein Problem :)

Ich denke auf dem Gerät selber wirst du keine Qualitätsänderungen feststellen, wegen dem kleinen Display.
Du kannst es aber überprüfen, ob deine Theorie stimmt, wenn du das Bild als jpg speicherst und dann die Datei am PC anschaust.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

07.09.2014, 13:01:53 via Website

Okay stimmt das werde ich ausprobieren.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

08.09.2014, 17:58:02 via Website

*Ich hab jetzt in dem Fall noch ein anderen Problem, wollte deswegen keinen neuen Thread aufmachen:
Wenn ich das Rechteck zum Zuschneiden vergrößern möchte müssen Höhe und Breite ja immer noch in dem Verhältnis bleiben in dem sie waren.
Deswegen habe ich folgendes gemacht:
1 private void adjustRectangle(int x, int y) {
2 float movement;
3 verhaeltnis = ((float) (rightBottom.y - leftTop.y))/((float) (rightBottom.x - leftTop.x));
switch(getAffectedSide(x,y)) {
case LEFT:
movement = x-leftTop.x;
if(isInImageRange(new PointF(leftTop.x+movement,leftTop.y+movement)))
8 leftTop.set((int) (leftTop.x+movement),(int) (leftTop.y+(movement*verhaeltnis)));
break;
case TOP:
movement = y-leftTop.y;
if(isInImageRange(new PointF(leftTop.x+movement,leftTop.y+movement)))
leftTop.set((int) (leftTop.x+(movement/verhaeltnis)),(int) (leftTop.y+movement));
break;
case RIGHT:
movement = x-rightBottom.x;
if(isInImageRange(new PointF(rightBottom.x+movement,rightBottom.y+movement)))
rightBottom.set((int) (rightBottom.x+movement),(int) (rightBottom.y+(movement*verhaeltnis)));
break;
case BOTTOM:
movement = y-rightBottom.y;
if(isInImageRange(new PointF(rightBottom.x+movement,rightBottom.y+movement)))
rightBottom.set((int) (rightBottom.x+(movement/verhaeltnis)),(int) (rightBottom.y+movement));
break;
}
}
Also in der dritten Zeile berechne ich das Verhältnis von Höhe zu Breite und dann z.B. in der 8. Zeile multipliziere ich den Wert der Bewegung mit dem Verhältnis. Beim debuggen zeigt er mir auch das richtige Verhältnis an. Also nach meiner Logik müsste das funktionieren :D
Aber das Verhältnis bleibt nicht so. Je nachdem wie oft ich verkleiner und vergrößer desto stärker ändert sich das Verhältnis zu dem Ursprünglichen.
Woran kann das liegen?*

Hab es jetzt so gelöst, das ich bei dem TouchEvent UP kontrolliere wie das Verhältnis ist und wenn es nicht richtig ist bearbeite ich den rightBottom Punkt.

— geändert am 11.09.2014, 18:47:04

Antworten