2012-04-30 22 views
29

Tengo un problema. Cuando trato de obtener una imagen de la cámara, la calidad es muy baja. Primero, capture la imagen con la cámara, luego guárdela en el directorio y al mismo tiempo, obtenga esa imagen y la muestre en mi aplicación. La imagen guardada en el directorio es de buena calidad, pero cuando la obtengo del directorio, la calidad es baja. . a continuación es mi código de ejemplo:Baja calidad de imagen/imagen al capturar desde la cámara

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(); 
     } 
} 

cualquier solución/sugerencia? Gracias :)

Resuelto

El problema resuelto cuando sigo el código dado por Antrromet continuación

+0

No veo que obtenga la foto del directorio en cualquier lugar? Todo lo que veo es que usa la miniatura incluida, que, dicho sea de paso, es propensa a errores, ya que según mi experiencia, no todos los dispositivos realmente devuelven ningún "dato" extra. La miniatura, obviamente, no tendrá el mismo tamaño que la imagen "completa" en su medio de almacenamiento. –

+0

realmente llamo a la cámara usando esto: Intent cameraIntent = new Intent (android.provider.MediaStore.ACTION_IMAGE_CAPTURE); \t \t \t \t \t \t startActivityForResult (cameraIntent, CAMERA_PIC_REQUEST); ¿cuál es su sugerencia para evitar el error? Y ¿cómo obtener el tamaño real de la imagen? Gracias por su respuesta :) – ckng

+0

El mejor enfoque es, probablemente, [proporcionar la ruta de salida] (http://stackoverflow.com/a/7529603/1029225) con la intención de 'Camera'. Alternativamente, también podría implementar [su propia lógica de captura de fotos] (http://stackoverflow.com/a/4855261/1029225) (más trabajo), o posiblemente use un ['FileObserver'] (http://developer.android. com/reference/android/os/FileObserver.html) en el directorio DCIM/Camera. –

Respuesta

70

He utilizado el siguiente código y esto funciona perfectamente bien para mí.

  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); 

y también

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(); 
        } 

       } 
     } 
    } 

y

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

El código anterior funciona, pero de alguna manera en OnActivityResult() -> la imagenUri se muestra nula a veces aunque he configurado imageUri al iniciar CameraActivity. @Antrromet – neaGaze

+0

^[SOLUCIONADO] -> declaró imageUri y ContentValues ​​en el método onCreate() en lugar de OnClick oyente: D – neaGaze

+11

no puede entender el uso de - imageurl = getRealPathFromURI (imageUri); ? – NarendraJi

0

te daré algo que funciona para mí. ¡Pregunté lo mismo!

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

he encontrado la solución:

// Crear un nuevo código de carpeta:

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 

// Método para tomar una imagen

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); 
    } 
Cuestiones relacionadas