2016-03-23 3 views
11

Ich benutze den unten stehenden Code, um ein Bild mit der Kamera zu machen. Anstatt es zu speichern, möchte ich es in Base64 codieren und danach an eine andere API als Eingabe übergeben. Ich kann keine Methode sehen, wie man Code ändert, um Bilder in Base64 anstelle von normalen Dateien zu machen.Bild aufnehmen und in Base64 konvertieren

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

Ich versuche, Code zu verwenden, unten, um ein Bild zu Base64 zu konvertieren.

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

oben beschrieben sollte ein viel direkterer und einfacherer Weg, als Bild gespeichert werden und danach für Bild suchen, um es zu kodieren.

+0

'Ich versuche, Code zu verwenden, unten, um ein Bild zu Base64 konvertieren '. Nein, dieser Code dient zum Konvertieren einer Bitmap in base64. Und Sie haben eine JPG-Datei. Keine Bitmap – greenapps

+0

'newfile.createNewFile();'. Entferne das. Die Kamera-App erstellt die Datei. – greenapps

+0

'nehmen Sie Bilder in Base64 anstelle von normalen Dateien auf'. ?? Man kann Base64 nicht mit einer Datei vergleichen. – greenapps

Antwort

21

Versuchen Sie folgendes:
ImageUri zu 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 von FilePath 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; 

    } 

Ausgang: enter image description here

+0

Dieser Code erstellt eine Bitmap aus einer JPG-Datei. Dann wird die Bitmap erneut zu jpg konzertiert. Schließlich ist das jpg base64-codiert. Besser die Bitmap weglassen. Just base64 verschlüsselt die .jpg Datei direkt. – greenapps

+0

Außerdem wird noch eine Datei von der Kamera-App gespeichert. OP fragte nach etwas ohne Datei. – greenapps

+0

Aber vor allem kann ich die Datei nicht sehen. Ich benutze TC, um es zu suchen, aber es ist nirgends. – plaidshirt

0

Ich habe meinen Code wie folgt geschrieben:

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

Es funktioniert perfekt ...

+2

Während dieser Code die Frage beantworten kann, würde die Bereitstellung eines zusätzlichen Kontextes hinsichtlich dessen, wie und/oder warum er das Problem löst, den langfristigen Wert der Antwort verbessern. Bitte lesen Sie diese [how-to-answer] (http://stackoverflow.com/help/how-to-answer) für eine qualitativ hochwertige Antwort. – thewaywewere