Wie Fotos mit Fotoapparat.IO verkleinern auf feste Breite?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wie Fotos mit Fotoapparat.IO verkleinern auf feste Breite?

    Neu

    Moin Leute,

    ich benutze die Fotoapparat.io lib um Fotos aufzunehmen. Seitens fotoapparat wird ein BitmapPhoto Object erstellt, was die Aufnahme beinhaltet.

    Java-Quellcode

    1. private void takePicture() {
    2. PhotoResult photoResult = fotoapparat.takePicture();
    3. photoResult
    4. .toBitmap(
    5. new Function1<Resolution, Resolution>() {
    6. @Override
    7. public Resolution invoke(Resolution resolution) {
    8. float scale768 = (float) 768 / (float) resolution.width;
    9. return scaled(scale768).invoke(resolution);
    10. }
    11. }
    12. )
    13. .whenDone(new WhenDoneListener<BitmapPhoto>() {
    14. @Override
    15. public void whenDone(@Nullable BitmapPhoto bitmapPhoto) {
    16. // Zeige photo in ImageView
    17. }
    18. });
    19. }
    Alles anzeigen

    Das klappt auch soweit mit dem Aufnehmen im Großen und Ganzen. Es ist in voller Auflösung, auf älteren Geräten führts da häufig zu OutOfMemoryException... uuuund ich brauchs nicht so groß.

    Ich würde gerne die Aufnahmen unabhängig von ursprünglicher Sensorgröße und Verhältnis, die lange Seite auf 768 pixel und die kurze im entsprechenden Verhältnis abspeichern. Der obige Code funktioniuert nicht für alle Sensoren, ältere Geräte bekommen nicht exakt 768 pixel, mal leicht drüber oder drunter - je nach Auflösung.

    Für eine exakte Auflösung habe ich folgendes:

    Java-Quellcode

    1. photoResult.toBitmap(
    2. new Function1<Resolution, Resolution>() {
    3. @Override
    4. public Resolution invoke(Resolution resolution) {
    5. int width = 768; // hier mal 4:3
    6. int height = 576; // Das echte Verhältnis berechne ich Anhand resolution Parameters oben, hier mal der Einfachheit 4:3
    7. Resolution sollAufloesung = new Resolution(width, height);
    8. return scaled(1.0F).invoke(sollAufloesung);
    9. }
    10. }
    11. )
    Alles anzeigen
    mit 1.0 als scale Faktor verzerrt das Bild und und mit 1.3F wird die sollAufloesung verändert.

    Jemand eine Idee?
  • Neu

    Hallo ich würde es in etwas so machen.

    Quellcode

    1. PhotoResult photoResult=fotoapparat.takePicture();
    2. PendingResult<BitmapPhoto> pr = photoResult.toBitmap();
    3. try {
    4. Bitmap bitmap = pr.await().bitmap;
    5. bitmap = propScaleBitmap(bitmap,760);
    6. } catch (ExecutionException e) {
    7. e.printStackTrace();
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. }
    Alles anzeigen


    Quellcode

    1. public Bitmap propScaleBitmap(Bitmap bitmap, int newDimension ) {
    2. if (bitmap == null) {
    3. return null;
    4. }
    5. float xyRatio = 0;
    6. int newWidth = 0;
    7. int newHeight = 0;
    8. if(bitmap.getWidth() > bitmap.getHeight()) {
    9. xyRatio = (float) newDimension / bitmap.getWidth();
    10. newHeight = (int) (bitmap.getHeight() * xyRatio);
    11. bitmap = Bitmap.createScaledBitmap(
    12. bitmap, newDimension, newHeight, true);
    13. } else {
    14. xyRatio = (float) newDimension / bitmap.getHeight();
    15. newWidth = (int) (bitmap.getWidth() * xyRatio);
    16. bitmap = Bitmap.createScaledBitmap(
    17. bitmap, newWidth, newDimension, true);
    18. }
    19. return bitmap;
    20. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P
  • Neu

    Wenn du beide Seiten fest setzt wird das nur gehen wenn der sensor genau 4x3 ist. Das ist aber in den seltensten Fällen so, also wird das Bild verzerrt.

    Du musst dir die längste Seite des Bildes suchen diese auf 768 setzen. Nun musst du den Faktor für die Umrechnung bestimmen und mit diesen die andere Seite bestimmen. Dann solte es auch in deiner

    "new Resolution(width, height);"

    mit einen scale Faktor 1 gehen.

    Wenn du ein genau 768 x 568 haben willst, müsstest du ja intelegent etweder was wegschneiden oder Ränder hinzufügen.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()