2016-03-23 33 views
11

Używam poniższego kodu, aby zrobić zdjęcie aparatem. Zamiast zapisywania chciałbym zakodować go na Base64, a następnie przekazać go do innego interfejsu API jako danych wejściowych. Nie widzę metody, jak zmodyfikować kod do robienia zdjęć w zwykłych plikach w Base64.Zrób zdjęcie i przekonwertuj do 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"); 
     } 
    } 
} 

Próbuję użyć poniższego kodu, aby przekonwertować zdjęcie na 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); 
} 

Powyższe powinno być znacznie prostsze i prostsze niż zapisywanie obrazu, a następnie wyszukiwanie obrazu do kodowania.

+0

'próbuję użyć kodu poniżej, aby przekonwertować obraz do Base64 '. Ten kod nie służy do konwersji bitmapy na base64. I masz plik .jpg. Brak bitmapy. – greenapps

+0

'newfile.createNewFile();'. Usuń to. Aplikacja Aparat utworzy plik. – greenapps

+0

'rób zdjęcia w Base64 zamiast zwykłych plików'. ?? Nie można porównać base64 z plikiem. – greenapps

Odpowiedz

21

Spróbuj tego:
ImageUri do 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); 
      } 
     } 

Kodowanie bitmapę w 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; 
    } 

Koduje z filePath do 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; 

    } 

wyjściowa: enter image description here

+0

Ten kod tworzy bitmapę z pliku jpg. Następnie bitmapa jest ponownie zgodna z jpg. Wreszcie jpg jest kodowane base64. Lepiej pomiń mapę bitową. Po prostu zakoduj plik .jpg bezpośrednio w base64. – greenapps

+0

Co więcej, nadal jest plik zapisany przez aplikację aparatu. OP poprosił o coś bez pliku. – greenapps

+0

Ale przede wszystkim nie widzę pliku. Używam TC do przeszukiwania, ale nigdzie go nie ma. – plaidshirt

0

Ja napisałem swój kod tak:

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

To działa doskonale ...

+2

Chociaż ten kod może odpowiedzieć na pytanie, podanie dodatkowego kontekstu dotyczącego tego, w jaki sposób i/lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. Przeczytaj ten [jak-odpowiedź] (http://stackoverflow.com/help/how-to-answer) w celu uzyskania wysokiej jakości odpowiedzi. – thewaywewere