1

J'utilise l'intention de caméra par défaut pour capturer des images dans mon activité. Après cela, je stocke leur chemin dans un tableau. À la fin de l'activité, je copie les images dans mon dossier d'application. Pour une raison quelconque, les images ne copient pas en qualité complète. Ex: Si une image dans le dossier DCIM est de 1,04 Mo, alors il n'y a qu'une ~ 2 Ko dans mon dossier d'application. J'utilise ce code dans mon application. Pour appeler l'intention de la caméra:La copie d'images du dossier DCIM vers un autre dossier entraîne une perte de qualité d'image

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 1); 

Dans onActivity Résultat que je fais:

Bitmap photo = (Bitmap) data.getExtras().get("data"); 

Uri tempUri = getImageUri(context, photo); 

imagePath = getRealPathFromURI(tempUri); 

imagesList.add(imagePath); 

getImageUri() et getRealPathFromURI() sont:

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = Images.Media.insertImage(inContext.getContentResolver(), 
      inImage, "Title", null); 
    return Uri.parse(path); 
} 

public String getRealPathFromURI(Uri uri) { 
    Cursor cursor = context.getContentResolver().query(uri, null, null, 
      null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
} 

À la fin de mon activité, je utilise cette méthode pour copier des images dans mon dossier d'application:

for (int i = 0; i < noteImagesList.size(); i++) { 

     File fileimg = new File(noteImagesList.get(i)); 

     File newImageFile = new File(parentfolderpath, 
          i+"_newimage.jpg"); 
        newImageFile.createNewFile(); 

     Bitmap myBitmap = BitmapFactory.decodeFile(fileimg 
          .getAbsolutePath()); 

     FileOutputStream fOut = new FileOutputStream(
          newImageFile); 

     myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut); 
     fOut.flush(); 
     fOut.close(); 

     if (myBitmap != null) { 

     if (!myBitmap.isRecycled()) { 
      myBitmap.recycle(); 
     } 

     myBitmap = null; 
     } 


    } 

Après la copie, l'image perd sa qualité et sa taille. Lorsque l'image dans le dossier DCIM est nette et autour de ~ 1 Mo, après la copie, elle est floue et autour de ~ 1 Ko.

Quelqu'un pourrait-il dire ce qui me manque lors de la copie d'images?

Modifier

code ci-dessus fonctionne très bien si je l'utilise pour sélectionner des images de la galerie, mais toujours pas de chance avec les images de la caméra.

Edit 2

j'ai utilisé ce code aussi, mais même résultat.

public void copyFile(File src, File dst) throws IOException { 
    FileChannel inChannel = new FileInputStream(src).getChannel(); 
    FileChannel outChannel = new FileOutputStream(dst).getChannel(); 
    try { 
     inChannel.transferTo(0, inChannel.size(), outChannel); 
    } finally { 
     if (inChannel != null) 
      inChannel.close(); 
     if (outChannel != null) 
      outChannel.close(); 
    } 
} 
+0

essayez d'utiliser 'Bitmap.CompressFormat.PNG' au lieu de' Bitmap.CompressFormat.JPEG' –

+0

@SagarPilkhwal même résultat en utilisant CompressFormat PNG –

+0

pourquoi vous faites 'inImage.compress (Bitmap.CompressFormat.JPEG, 100, octets) ; 'and ByteArrayOutputStream bytes = new ByteArrayOutputStream();' dans 'getImageUri()' –

Répondre

1

La documentation indique que si vous passez un URI indiquant où écrire le fichier, vous récupérerez l'image en taille dans les données extras. Cependant, si vous ne transmettez pas d'URI, vous obtenez une petite version (une vignette).

Comme vous ne transmettez pas d'URI, vous obtenez la vignette, puis vous enregistrez./copier cela, pas la version en taille réelle.

Questions connexes