Aufgenommene Bilder verkleinern

  • keiner eine idee? Um meine sache genauer zu beschreiben: ich habe eine custom listview wie das hier ungefähr:

    HTML
    http://2.bp.blogspot.com/-swlVxU_S-Jo/UOxRcqXl7aI/AAAAAAAAAtk/4a5r_rJFaMg/s1600/a1.png


    ich habe zusätzlich ein button, das die camera startet um ein foto zu schießen. wenn ein foto gemacht wird, wird die resource id vom foto als string auf einer datenbank abgelegt, beispiel: ../sdcard/pics/beispiel.jpg


    bei der custom listview geh ich folgendermaßen vor, um bestimmte infos aus der db zu holen:



    wäre es effizienter, wenn das geschossene foto gleich mit einer bestimmten größe auf die sdcard abgelegt wird, oder wenn man es im nachhinhein macht? also, die resource id holen, die dann verkleinern... aber wie verbinde ich das dann mit dem Simplecursoradapter!?
    was wäre da die beste vorgehensweise?

  • 1) erst verkleinern, dann speichern. Dauert beim Schießen des Fotos ein wenig länger, reduziert aber die Zeiten beim Laden. Und da jedes Bild nur einmal geschossen aber mindestens zwei mal geladen wird dürfte klar sein, wo optimiert werden muss.
    (Eventuell das Skalieren in einen Hintergrundprozess legen...)


    2) Du hast irgend ein Google Nexus, oder? Meines Wissens die einzigen Geräte, die eine derartige Einschränkung besitzen.


    3) Vielleicht hilft Dir dieses offizielle Training ein bisschen weiter.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Marco,


    zu 1) ja das hab ich mir auch so gedacht.


    zu 2) ne hab ein lg p880 wo ich es teste. welche einschränkung meinst du?


    zu 3) hmm, ja das hatte ich mir bereits angeschaut, jedoch weis ich nicht wo und wie ich das mit meinem methoden zur speicherung von fotos vornhemen soll. die methoden die ich habe sind folgende:


  • Hallo Marco,


    also ich hing jetzt den ganzen tag dran ohne ein wenig voran zu kommen. Ich hab mir auch viele (zu viele, so dass ich gar kein überblick mehr hab) anleitungen und codes bei stackoverflow etc. angesehn und getestet, jedoch wie gesagt ziemlich durcheinander bin.


    Bin ja momentan so weit mit meiner application, dass wenn ich mit dem button die camera öffne und auf capture klicke, ein bild als jpd in einem separaten ordner auf der sd-karte gespeichert wird. Da die Bilder zu groß (2448x3264 pixel) für ein imageview der größe 90x90 pixel sind, muss ich die verkleinern. der imageview ist ein teil eines custom listviews, welches auch textviews beinhaltet. den listview öffne ich separat über einen button. das bedeutet ich müsste die gespeicherten großen jpgs verkleinern und erneut speichern. du hast mir gesagt, dass ich die bilder gleich zu beginn bei der aufnahme verkleinert speichern soll. macht ja auch sinn (wäre ja unnötiger ressourcen verbrauch).


    In meinem code beginnt die speicherung ja hier:

    Code
    // Create a media file name
    		String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
    		File mediaFile;
    		if (type == MEDIA_TYPE_IMAGE) {
    			mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
    		} 
    		else {
    			return null;
    		}


    heisst, ich müsste in der if bedingung anfangen zu verkleinern bevor der mediaFile erstellt wird (hoffe ich liege da richtig!? :-[ ).
    Jetzt hab ich diese methode bei stackoverflow gefunden, womit man die bilder verkleinert und diese methode diese dann speicher.


    letztendlich sieht meine methode am ende so aus:


    weiß ja nicht mal ob ich das so richtig habe, bekomme jedoch ne nullpointer Exception ;( (kein plan warum)



    Zeile 317: Bitmap bm = BitmapFactory.decodeFile(fileUri.toString());
    Zeile 293: return Uri.fromFile(getOutputMediaFile(type)); (im code des vorherigen beitrags)
    Zeile 285: fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); (im code des vorherigen beitrags)
    Zeile 282: private void captureImage() throws IOException { (im code des vorherigen beitrags)
    Zeile 187: captureImage(); --> private void captureImage() throws IOException {


    wäre cool, wenn das gelöst wird. schwer ist es ja net (eigentlich) O:-)
    danke für eure tipps im voraus

  • Ich schätze mal das fileUri nicht bekannt ist, da nicht global.
    Du musst dann wohl das Abspeichern nochmal überarbeiten ;)
    Am besten du machst eine Abspeichermethode, die das Ergebnis verarbeitet.
    Am besten fragst du von der Camera nur die reinen Daten und kein abgespeichertes Bild ab.

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • und wie? das ist ja das problem. versuche ja schon alles aber klappt nicht, bzw. ich kriege es net hin. ich will ja eine art kleines vorschaubild eines gespeicherten fotos in einer imageview (thumbnail). ich will es aber gleich als thumbnail speichern und nicht in fullHD.

  • Kannst du dann nocheinmal die komplette Klasse posten und nicht nur einen Teil davon, damit wir einen Überblick haben?

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Hey Kogoro,


    sry das es so lange gedauert hat, habe deine Nachricht sobeben gelesen.


    Klar kann ich die klasse posten, hier bitte:



    hab bei stackoverflow gelesen, dass man man die größe eines bildes nicht
    beeinflussen kann solange man MediaStore.ACTION_IMAGE_CAPTURE nutzt. Das sollte mit einer custom camera funzen. (weiß aber nicht ob diese aussage richtig ist).

  • Das Rezisen muss in der onActivityResult sein, im Moment rufst du das Image auf, bevor du das Bild überhaupt geschossen hast. Daher geht das nicht. Also entweder eine Custom View machen bzw. passt du evt. das hier an: https://github.com/girishnair1…sh-Camera-Library-Project


    Dort kannst du das Bild bestimmt auch direkt anpassen ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Hallo Kogoro,


    also ich hab deine links mir angeschaut. bin aber nicht weiter gekommen. seit 2 wochen hänge ich an diesem problem. :-/ :-/ :-/ :-/


    habe nun ein tutorial gefunden , der mein problem beheben würde. Leider verstehe ich den code gar nicht, sodass ich es mit meinem verknüpfen kann.


    Zur erinnerung: es geht um die verkleinerte wiedergabe von bildern in listviews
    die methode die bei mir die listview füllt soll sieht so aus:


    die daten "n", "d", "p" werden aus der sqlite database geholt:


    KEY_PICTUREURI ist der pfad des speicherorts des bildes auf der sd-card. wie bereits erwähnt wird diese folgendermaßen gebildet, sobald ein bild mit der kamera geschossen wird:



    die uri wird als string in der db unter der spalte KEY_PICTUREURI gespeichert. wie kann ich denn jetzt die daten die ich von der db hole, mit dem methoden vom tutorial verknüpfen, damit ich eine kleine vorschau der bilder in den imageviews bekomme?


    der code vom tutorial funzt wunderbar. es läd alle bilder in einer listview auf, die auf der sd card gelagert sind.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!