Foto mit einer bestimmten Auflösung aufnehmen und als Datei ablegen.

insidERR

Mitglied
Hallo zusammen.
Ich bastle gerade an einer einfachen App, welche nur ein View mit einem Vorschuafenster und den Buttons: "Foto aufnehmen", "Foto uploaden" und Reset hat.
Es funktioniert auch alles soweit. Nur soll die App nicht die volle Sensorauflösung benutzen, da man auf den Fotos nicht jedes Krümmel in 10m Entfernung erkennen soll. Die Datenmenge wird einfach zu groß.
6-7MB sind mir zu viel. Auf einem anderen Gerät entstehen Foto mit max.2MB. Das reicht völlig.

Hier der Code, der durch den Button "Foto aufnehmen" aufgerufen wird.
Java:
    private void capturePhoto(String tmpFileName) {
        long timestamp = System.currentTimeMillis();
        ContentValues contentValues = new ContentValues();
        tmpFileName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ "/" + tmpFileName +".jpg";

        contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, "Archivator");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);

        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
        contentValues.put(MediaStore.MediaColumns.HEIGHT,2592);  //diese Zeile wird ignoriert
        contentValues.put(MediaStore.MediaColumns.WIDTH,1944);   //diese Zeile wird ignoriert

        imgFileName=tmpFileName;
        String finalTmpFileName = tmpFileName;
        imageCapture.takePicture(new ImageCapture.OutputFileOptions.Builder(getContentResolver(),MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues).build(), getExecutor(),new ImageCapture.OnImageSavedCallback()
                {
                    @Override
                    public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                        File imgFile = new  File(finalTmpFileName);
                        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                        ImageView myImage = (ImageView) previewImage;
                        myImage.setImageBitmap(myBitmap);
                    }

                    @Override
                    public void onError(@NonNull ImageCaptureException exception) {
                        System.out.println("Zeile: ERR " + exception.getMessage());
                        Toast.makeText(MainActivity.this, "Fehler: " + exception.getMessage() , Toast.LENGTH_SHORT).show();
                    }
                }
        );
    }

Ich habe zwei Zeilen markiert, die anscheinend ignoriert werden, da die Fotos eine Auflösung von 3456x4608 haben.
Hat jemand ne Idee, woran es liegt und was geändert werden kann/soll, damit es funktioniert?

Danke
 

KonradN

Super-Moderator
Mitarbeiter
Ein Ansatz wäre erst einmal, dass man dies im Builder von ImageCapture angibt per setTargetResolution:

Aber die Dokumentation gibt auch eine klare Aussage, dass immer die nächste mögliche Auflösung genommen wird. Da sind also nicht beliebige Dinge wählbar. Wenn die Kamera da also etwas nicht unterstützt, dann wird das ignoriert. Daher kann Dein Weg auch prinzipiell funktionieren nur eben mit den gleichen Einschränkungen.

Daher evtl. einfach erst einmal schauen, was für Auflösungen überhaupt unterstützt werden um da dann eine vorhandene zu wählen.
 

Jw456

Top Contributor
Hallo dann setze doch gleich die Camera2 Eigenschaften auf die Gösse wie du sie haben willst.
Also mach das Foto schon in der richtigen Größe.
 

insidERR

Mitglied
Hallo ihr beiden,
danke für die Ideen. Haben haben mich zum Ergebnis geführt.

Hätte vielleicht noch den Code für die Vorschau mit angeben sollen. Dort konnte man wirklich die Auflösung einstellen. Die Kamera schluckt nicht alles, so musste ich erst mit einer anderen App herausfinden, was geht.

Java:
   private void startCameraX(ProcessCameraProvider cameraProvider) {
        cameraProvider.unbindAll();
        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();
        Preview preview = new Preview.Builder()
                .setMaxResolution(new Size(500,750))
                .build();
        preview.setSurfaceProvider(previewView.getSurfaceProvider());


        //Auflösungen des Xcover 5
        //1440x1080 ;

        // Image capture use case
        imageCapture = new ImageCapture.Builder()
                //.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
                .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
                //.setSoftwareJpegEncoderRequested(true)
                .setTargetResolution(new Size(1080,1440))
                //.setTargetRotation(Surface.ROTATION_0)
                //.setTargetAspectRatio(AspectRatio.RATIO_4_3)
                .build();


        //bind to lifecycle:
        cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
    }
 

DefconDev

Bekanntes Mitglied
Auch wenn meine Antwort etwas spät ist aber wenn du nur zum Testen die Auflösung hardcoded einträgst bzw. du nur auf einem Handy das ganze entwickeltest ist das I.O.. Besser wäre es natürlich, die Auflösung von der cameraX API zur Laufzeit zu übergeben.

Zusätzlich, ich habe mehr oder weniger Erfahrung mit der Camera API und der Camera2 API. Letzteres ist eine Lowlevel API, die mich Nächte gekostet hat, gerade dann wenn du Nischen-Handys verwendest. Aber CameraX API von Google baut auf die camera2 API auf ist aber im Vergleich zu diesem Framework zum Teil immer noch sehr umfangreich.

Wenn du was schnelles suchst, kann ich dir nur dieses Framework empfehlen.
 

insidERR

Mitglied
Hi @DefconDev
Danke für deinen Post.

Ich hatte diese App "CameraView" schon gesehen und auch ausprobiert. Habe mir damit die möglichen Auflösungen anzeigen lassen und mich für die kleinste entschieden. Habe außerdem noch einen "Qualitätsmodus" in der App, wo die maximale Auflösung genommen wird. Allerdings werden die Fotos dann >10MB groß.

Die App soll auf nur zwei verschiedenen Geräten laufen.
Wir nutzen in der Firma in der Versandabteilung eine spezielle(nicht günstige) Kamera (G700SE mit Barcodescanner) von wo die Fotos 1x/Woche herunterladen und passend wegsortiert werden. Diese soll jetzt durch ein Smartphone (Xcover 5) mit meiner App ersetzt werden. Machen im Prinzip das gleiche. Nur das Smartphone ist günstiger und flexibler.

In ner anderen Abteilung wird eine ältere IXUS benutzt. Da ist es lästig die Fotos auf den PC zu laden. Mit der aktuellen Lösung wird das Foto bereits beim Erstellen auf den Server geladen wodurch das "SD-Karte raus, in der Leser rein und übertragen" entfällt. Kollegen, die das jetzt nutzen, sind begeistert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W App stürzt bei 2. Foto ab Android & Cross-Platform Mobile Apps 3
W Foto machen und es direkt per URI speichern und auswählen Android & Cross-Platform Mobile Apps 4
J Kamera - Foto wird nicht gespeichert Android & Cross-Platform Mobile Apps 2
S Foto-app hält galerie nicht aktuell Android & Cross-Platform Mobile Apps 9
S Android Geschossenes Foto in anderem Ordner speichern Android & Cross-Platform Mobile Apps 11
S Foto aufnehmen Android & Cross-Platform Mobile Apps 5
T Lesen / Schreiben einer Textdatei - SD-Karte Android & Cross-Platform Mobile Apps 42
OnDemand Allgemeine Fragen zu einer App Android & Cross-Platform Mobile Apps 4
Jose05 Wie kann man mit einer App Geld verdienen? Android & Cross-Platform Mobile Apps 6
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
M Activity einer anderen App mit result Android & Cross-Platform Mobile Apps 2
J Android Zugriff auf eine Datei, diese von einer anderen App erstellt wurde? Android & Cross-Platform Mobile Apps 11
Mo1234 Plattform in einer App. Bitte um Hilfe! Android & Cross-Platform Mobile Apps 8
A Mit Java neues item in ein string-array einer Strings.xml schreiben Android & Cross-Platform Mobile Apps 4
P Android Wie bestimme ich den Dateinamen einer Bilddatei? Android & Cross-Platform Mobile Apps 11
B Falsche ausgabe einer Rechnung! Android & Cross-Platform Mobile Apps 8
M Android Dynamische SchriftGröße einer TextView Android & Cross-Platform Mobile Apps 3
J Android Suche in einer ListView Android & Cross-Platform Mobile Apps 3
G Android Daten in einer Datenbank speichern Android & Cross-Platform Mobile Apps 1
J Android button mithilfe einer Methode automatisch erstellen Android & Cross-Platform Mobile Apps 6
JavaWolf165 Android Fehler beim Speichern/Downloaden einer Datei Android & Cross-Platform Mobile Apps 2
S Android Probleme beim Verbinden mit einer HTTPS Seite Android & Cross-Platform Mobile Apps 4
B Android wie kann ich in einer xml nach bestimme item suchen (DOM) Android & Cross-Platform Mobile Apps 7
C Android Diese Art von Werbung in einer App? Android & Cross-Platform Mobile Apps 1
? ständig ändernden Inhalten in einer App Android & Cross-Platform Mobile Apps 2
R Android Eine Website-frame in einer App Android & Cross-Platform Mobile Apps 4
H Android Aufrufen von "setContentView" in einer anderen Klasse Android & Cross-Platform Mobile Apps 3
S Die Erstellung einer eigenen App,Kosten? Android & Cross-Platform Mobile Apps 1
M Android Speichern einer .txt Datei im InternalStorage Android & Cross-Platform Mobile Apps 2
B Fragen zum Speichern einer Datei auf dem Gerät? Android & Cross-Platform Mobile Apps 7
C Auf Play Store verlinken - Code in einer Extraklasse Android & Cross-Platform Mobile Apps 1
G Thread in einer Service erstellen Android & Cross-Platform Mobile Apps 0
B Android Spieler Steuerung auf einer Map mit Berge? Android & Cross-Platform Mobile Apps 7
M Android Quellcode einer Website Android & Cross-Platform Mobile Apps 7
K Löschen einer Tabelle bei PlayStore update Android & Cross-Platform Mobile Apps 2
H Veröffentlichung einer Bezahl-App Android & Cross-Platform Mobile Apps 5
Robat Android ConcurrentModificationException während einer for Schleife Android & Cross-Platform Mobile Apps 15
D Android EditText und TextView haben unterschiedliche größen innerhalb einer TableRow Android & Cross-Platform Mobile Apps 18
M Umlaute im Quellcode einer Website richtig darstellen Android & Cross-Platform Mobile Apps 4
M Quellcode einer Website auslesen Android & Cross-Platform Mobile Apps 5
T Android platzsparende Codierung verschlüsselter Texte in einer URI Android & Cross-Platform Mobile Apps 8
S Android "Weiches wechseln" zwischen Views in einer Activity Android & Cross-Platform Mobile Apps 3
F Bei einer Android Java App, Objekte erstellen Android & Cross-Platform Mobile Apps 2
G eine Methode einer anderen Activity aufrufen Android & Cross-Platform Mobile Apps 9
G Einbinden einer Bibliothek's App Android & Cross-Platform Mobile Apps 2
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
A Fehler beim Starten eines Intents - alles in einer Klasse funktioniert... Android & Cross-Platform Mobile Apps 4
A Kann nicht in TextView einer anderen Klasse schreiben - wieso? Android & Cross-Platform Mobile Apps 9
A Beenden einer 2ten Activity Android & Cross-Platform Mobile Apps 3
T Android Multiple SDK-Support in einer Apk Android & Cross-Platform Mobile Apps 5
R Android Unterschiedliche Versionen von Android in einer App Android & Cross-Platform Mobile Apps 7
D Mehrere Kopien von einer Form Android & Cross-Platform Mobile Apps 7
M Wie in einer anderen "nicht canvas" klasse zeichne Android & Cross-Platform Mobile Apps 5
S Problem mit Einbindung einer externer Bibliothek Android & Cross-Platform Mobile Apps 2
S Variable Anzahl von Bytes aus einer Datei lesen Android & Cross-Platform Mobile Apps 2
P Erstellen einer Jar-File Android & Cross-Platform Mobile Apps 2
J picasso - url nur von bestimmten user zu erreichen Android & Cross-Platform Mobile Apps 1
R Android Objekt in bestimmten Pfad auf Android-gerät speichern Android & Cross-Platform Mobile Apps 8

Ähnliche Java Themen

Neue Themen


Oben