拍照并转成Base64

Posted

技术标签:

【中文标题】拍照并转成Base64【英文标题】:Take picture and convert to Base64 【发布时间】:2016-07-11 09:54:33 【问题描述】:

我使用下面的代码用相机拍照。我不想保存,而是将其编码为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);

上述应该是比保存图像然后寻找图像进行编码更直接和更容易的方法。

【问题讨论】:

I try to use code below to convert an image to Base64。不,该代码用于将位图转换为 base64。你有一个 .jpg 文件。没有位图。 newfile.createNewFile();。删除它。相机应用将创建文件。 take pictures in Base64 instead of regular files。 ??无法将 base64 与文件进行比较。 【参考方案1】:

试试这个:ImageUri 到位图:

 @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;
    

从 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;

    

输出:

【讨论】:

此代码从 jpg 文件生成位图。然后位图再次与 jpg 一致。最后 jpg 是 base64 编码的。最好省略位图。直接base64编码.jpg文件即可。 此外,相机应用程序还保存了一个文件。 OP 要求没有文件的东西。 但首先,我看不到文件。我正在使用 TC 搜索它,但它无处可寻。 如何返回,String 到 Bitmap 还是 Uri?【参考方案2】:

我的代码是这样写的:

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

效果很好……

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。请阅读此how-to-answer 以提供高质量的答案。【参考方案3】:

仅用于在我使用的 kotlin 中从位图转换为 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)
    

【讨论】:

【参考方案4】:

如果您希望您的 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?在哪里定义?!! profileUri 是位图的 uri。您可以查看有关如何从位图获取 uri ***.com/a/16168087/11118152 的答案

以上是关于拍照并转成Base64的主要内容,如果未能解决你的问题,请参考以下文章

vue实现拍照上传 + base64 上传功能

高拍仪拍照之后图片显示问题

Android选择/拍照 剪裁 base64/16进制/byte上传图片+PHP接收图片

使用base64编码传图片

使用base64编码传图片

使用base64编码传图片