2012-04-30 8 views
29

Mam jeden problem. Kiedy próbuję uzyskać obraz z kamery, jakość jest bardzo niska. Najpierw przechwyć zdjęcie za pomocą aparatu, a następnie zapisz w katalogu, a jednocześnie pobierz to zdjęcie i pokaż w mojej aplikacji. Zapisane zdjęcie w katalogu jest dobrej jakości, ale gdy je otrzymam z katalogu, jakość jest niska . poniżej jest mój przykładowy kod:Niska jakość obrazu/obrazu podczas przechwytywania z kamery

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

    if (requestCode == CAMERA_PIC_REQUEST) { 

     Bitmap thumbnail = (Bitmap) intent.getExtras().get("data"); 

     if (g==1) 
     { 
      ImageView myImage = (ImageView) findViewById(R.id.img5); 
      myImage.setImageBitmap(thumbnail); 

      View a = findViewById(R.id.img5); 
      a.setVisibility(View.VISIBLE); 

      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, stream); 

      byteArray1 = stream.toByteArray(); 
     } 
} 

dowolne rozwiązanie/sugestia? Dzięki :)

rozwiązać

Problem rozwiązany, gdy śledzę kodu podanego przez Antrromet poniżej

+0

Nie widzisz, że masz zdjęcie z katalogu? Widzę tylko, że korzystasz z dołączonej miniatury, która, nawiasem mówiąc, jest podatna na błędy, ponieważ z mojego doświadczenia nie wszystkie urządzenia zwracają "dodatkowe dane". Miniatura oczywiście nie będzie miała takiego samego rozmiaru jak "pełny" obraz na nośniku. –

+0

tak naprawdę nazywam kamerę za pomocą tego: Intent cameraIntent = new Intent (android.provider.MediaStore.ACTION_IMAGE_CAPTURE); \t \t \t \t \t \t startActivityForResult (cameraIntent, CAMERA_PIC_REQUEST); jaka jest Twoja sugestia, aby uniknąć błędu i jak uzyskać rzeczywisty rozmiar zdjęcia? Dziękuję za odpowiedź :) – ckng

+0

Najlepszym rozwiązaniem jest prawdopodobnie [podać ścieżkę wyjściową] (http://stackoverflow.com/a/7529603/1029225) z intencją kamery. Alternatywnie możesz również zaimplementować [własną logikę przechwytywania zdjęć] (http://stackoverflow.com/a/4855261/1029225) (więcej pracy) lub ewentualnie użyć ['FileObserver'] (http://developer.android. com/reference/android/os/FileObserver.html) w katalogu DCIM/Camera. –

Odpowiedz

70

Użyłem poniższy kod i to działa perfekcyjnie dla mnie.

  values = new ContentValues(); 
      values.put(MediaStore.Images.Media.TITLE, "New Picture"); 
      values.put(MediaStore.Images.Media.DESCRIPTION, "From your Camera"); 
      imageUri = getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
      startActivityForResult(intent, PICTURE_RESULT); 

a także

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 

     case PICTURE_RESULT: 
      if (requestCode == PICTURE_RESULT) 
       if (resultCode == Activity.RESULT_OK) { 
        try { 
         thumbnail = MediaStore.Images.Media.getBitmap(
           getContentResolver(), imageUri); 
         imgView.setImageBitmap(thumbnail); 
         imageurl = getRealPathFromURI(imageUri);  
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 

       } 
     } 
    } 

i

public String getRealPathFromURI(Uri contentUri) { 
     String[] proj = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(contentUri, proj, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 
+0

Powyższy kod działa, ale w jakiś sposób w OnActivityResult() -> obraz stanu wyświetla się null czasami nawet jeśli ustawiłem imageUri podczas uruchamiania CameraActivity. @Antrromet – neaGaze

+0

^[SOLVED] -> zadeklarował imageUri i ContentValues ​​w metodzie onCreate() zamiast na detektorie onClick: D – neaGaze

+11

nie może zrozumieć użycia - imageurl = getRealPathFromURI (imageUri); ? – NarendraJi

0

dam ci coś, co działa dla mnie. Zapytałem to samo!

Solution to save a picture in a specific folder without lost quality

znalazłem rozwiązanie:

// Utwórz nowy kod folderu:

String path = String.valueOf(Environment.getExternalStorageDirectory()) + "/your_name_folder"; 
      try { 
       File ruta_sd = new File(path); 
       File folder = new File(ruta_sd.getAbsolutePath(), nameFol); 
       boolean success = true; 
       if (!folder.exists()) { 
        success = folder.mkdir(); 
       } 
       if (success) { 
        Toast.makeText(MainActivity.this, "Carpeta Creada...", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception ex) { 
       Log.e("Carpetas", "Error al crear Carpeta a tarjeta SD"); 
      } 

      Intent i = new Intent(MainActivity.this, MainActivity.class); 
      startActivity(i); 
      finish();//agregue este 

// metody, aby zrobić zdjęcie

public void clickFoto(View view) { 
     takePic(); 
    } 

// takePic()

private void takePic() { 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     *File file = new File(Environment.getExternalStorageDirectory(), "/your_name_folder/a" + "/photo_" + timeStamp + ".png");* 
     imageUri = Uri.fromFile(file); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, PICTURE_RESULT); 
    } 

// onActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 

      case PICTURE_RESULT: 
       if (requestCode == PICTURE_RESULT) 
        if (resultCode == Activity.RESULT_OK) { 
         try { 
          Bitmap thumbnail = MediaStore.Images.Media.getBitmap(
            getContentResolver(), imageUri); 
          imgFoto.setImageBitmap(thumbnail); 
          imageurl = getRealPathFromURI(imageUri); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 

        } 
     } 
    } 

// getRealPathFromUri

public String getRealPathFromURI(Uri contentUri) { 
     String[] proj = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = managedQuery(contentUri, proj, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 
Powiązane problemy