2016-03-23 37 views
11

Io uso il codice qui sotto per fare una foto con la fotocamera. Invece di salvare vorrei codificarlo su Base64 e successivamente passarlo a un'altra API come input. Non riesco a vedere il metodo, come modificare il codice per scattare foto in Base64 anziché normali file.Scatta foto e converti in Base64

public class CameraDemoActivity extends Activity { 
    int TAKE_PHOTO_CODE = 0; 
    public static int count = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/picFolder/"; 
     File newdir = new File(dir); 
     newdir.mkdirs(); 

     Button capture = (Button) findViewById(R.id.btnCapture); 
     capture.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       count++; 
       String file = dir+count+".jpg"; 
       File newfile = new File(file); 
       try { 
        newfile.createNewFile(); 
       } 
       catch (IOException e) 
       { 
       } 

       Uri outputFileUri = Uri.fromFile(newfile); 

       Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

       startActivityForResult(cameraIntent, TAKE_PHOTO_CODE); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { 
      Log.d("CameraDemo", "Pic saved"); 
     } 
    } 
} 

Provo ad usare il codice qui sotto per convertire le immagini a Base64.

public static String encodeToBase64(Bitmap image, Bitmap.CompressFormat compressFormat, int quality) 
{ 
    ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); 
    image.compress(compressFormat, quality, byteArrayOS); 
    return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT); 
} 

sopra descritta dovrebbe essere un modo molto più diretta e più facile che il salvataggio di immagini e poi alla ricerca di immagine da codificare.

+0

'cerco di usare il codice qui sotto per convertire un'immagine in Base64 '. Nessun codice è per convertire una bitmap in base64. E tu hai un file .jpg. Nessuna bitmap. – greenapps

+0

'newfile.createNewFile();'. Rimuovi quello. L'app Fotocamera creerà il file. – greenapps

+0

'scatta foto in Base64 invece dei normali file'. ?? Non è possibile confrontare base64 con un file. – greenapps

risposta

21

Prova questo:
ImageUri al Bitmap:

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 

      if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { 
       final Uri imageUri = data.getData(); 
       final InputStream imageStream = getContentResolver().openInputStream(imageUri); 
       final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream); 
       String encodedImage = encodeImage(selectedImage); 
      } 
     } 

Encode bitmap in base64

private String encodeImage(Bitmap bm) 
    { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bm.compress(Bitmap.CompressFormat.JPEG,100,baos); 
     byte[] b = baos.toByteArray(); 
     String encImage = Base64.encodeToString(b, Base64.DEFAULT); 

     return encImage; 
    } 

Encode da FilePath a Base64

private String encodeImage(String path) 
    { 
     File imagefile = new File(path); 
     FileInputStream fis = null; 
     try{ 
      fis = new FileInputStream(imagefile); 
     }catch(FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
     Bitmap bm = BitmapFactory.decodeStream(fis); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bm.compress(Bitmap.CompressFormat.JPEG,100,baos); 
     byte[] b = baos.toByteArray(); 
     String encImage = Base64.encodeToString(b, Base64.DEFAULT); 
     //Base64.de 
     return encImage; 

    } 

uscita: enter image description here

+0

Questo codice crea una bitmap da un file jpg. Quindi la bitmap viene di nuovo riprodotta su jpg. Finalmente il jpg è codificato in base64. Meglio omettere la bitmap. Solo base64 codifica direttamente il file .jpg. – greenapps

+0

Inoltre c'è ancora un file salvato dall'app della fotocamera. OP ha chiesto qualcosa senza un file. – greenapps

+0

Ma prima di tutto, non riesco a vedere il file. Sto usando TC per la ricerca, ma non è da nessuna parte. – plaidshirt

0

ho scritto il mio codice come questo:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Camera mCamera = Camera.open(); 
     mCamera.startPreview();// I don't know why I added that, 
           // but without it doesn't work... :D 

     mCamera.takePicture(null, null, mPicture); 
    } 

    private Camera.PictureCallback mPicture = new Camera.PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      System.out.println("***************"); 
      System.out.println(Base64.encodeToString(data, Base64.DEFAULT)); 
      System.out.println("***************"); 
     } 
    }; 
} 

Funziona perfettamente ...

+2

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e/o perché risolve il problema migliorerebbe il valore a lungo termine della risposta. Leggere questo [come risposta] (http://stackoverflow.com/help/how-to-answer) per fornire una risposta di qualità. – thewaywewere