拍照并转换为Base64

31

我使用以下代码使用相机拍照片。不想保存,而是想将其编码为Base64,然后将其作为输入传递给另一个API。我不知道如何修改代码以便以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");
        }
    }
}

我尝试使用下面的代码将图像转换为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);
}
上述描述应该比保存图像后查找图像并对其进行编码更为直接和简单。

我尝试使用下面的代码将图像转换为Base64。但是该代码是用于将位图转换为base64。而您有一个.jpg文件,没有位图。 - greenapps
移除此行代码:newfile.createNewFile();。相机应用将会创建该文件。 - greenapps
使用Base64拍照,而不是普通文件。?? Base64和文件是无法进行比较的。 - greenapps
5个回答

68

试试这个:
将ImageUri转换为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);
            }
        }

将位图编码为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;
    }

将文件路径编码为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;

    }

输出: 在此输入图片描述


这段代码从一个jpg文件创建了一个位图。然后将位图再次转换为jpg格式。最后,将jpg文件进行base64编码。最好省略位图步骤,直接对.jpg文件进行base64编码。 - greenapps
此外,相机应用程序仍保存有一个文件。OP 要求没有文件的东西。 - greenapps
但首先,我找不到这个文件。我正在使用TC进行搜索,但它无处可见。 - plaidshirt
你如何将String转换为Bitmap或Uri? - Jamaldin Sabirjanov
我将这段代码转换成了Kotlin,但现在它无法工作。 - Sajib saha

3
我把代码写成了这样:

我已经像下面这样编写了我的代码:

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

它完美地工作...


5
虽然这段代码可能回答了问题,但提供关于它如何以及/或者为什么能解决问题的额外上下文会提高答案的长期价值。请阅读此如何回答问题以提供高质量的回答。 - thewaywewere

2

我使用以下代码将位图转换为Base64字符串:

private fun encodeImage(bm: Bitmap): String? {
        val baos = ByteArrayOutputStream()
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val b = baos.toByteArray()
        return Base64.encodeToString(b, Base64.DEFAULT)
    }

1

  try {
                    val imageStream: InputStream? = requireActivity().getContentResolver().openInputStream(mProfileUri)
                    val selectedImage = BitmapFactory.decodeStream(imageStream)
                    val baos = ByteArrayOutputStream()
                    selectedImage.compress(Bitmap.CompressFormat.JPEG, 100, baos)
                    val b = baos.toByteArray()
                    val encodedString: String = Base64.encodeToString(b,Base64.DEFAULT)

                    Log.d("check string" ,encodedString.toString())

                } catch (e: IOException) {
                    e.printStackTrace()
                }

For kotlin use code is given bellow just copy this and give image uri at "mProfileUri"


1

如果您希望您的base64字符串遵循标准格式,在从任何提供的答案中获取您的base64方法后,请添加此内容

String base64 =""; //Your encoded string
base64 = "data:image/"+getMimeType(context,profileUri)+";base64,"+base64;

获取 imageExtension 的方法是:
   public static String getMimeType(Context context, Uri uri) {
        String extension;
        if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
            //If scheme is a content
            final MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
        } else {
            //If scheme is a File
            //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
            extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());
        }
        return extension;
    }

profileUri是什么?它在哪里定义的?!! - mafortis
profileUri是您位图的URI。您可以查看此答案以了解如何从位图获取URI https://dev59.com/bmsy5IYBdhLWcg3w0RXT#16168087 - Martin Mbae

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接