【问题标题】:How to convert a photo taken from the device to base64?如何将从设备拍摄的照片转换为base64?
【发布时间】:2022-01-01 08:23:42
【问题描述】:

我有两个用于拍照的按钮,我想将照片转换为 base64 以将它们发送到我的数据库,但是使用位图会大大降低照片的质量,我怎样才能获得全尺寸的照片和将其转换为不带位图的base64?,或者有什么方法可以使用位图获得高质量的照片。

您可以将照片保存在临时目录中以获取完整尺寸的照片。

ImageView imageV, imageV2;
Button btn, btn2;
static final int IMAGE_REQUEST = 1;
static final int IMAGE_REQUEST2 = 2;

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

    imageV = findViewById(R.id.image_view);
    imageV2 = findViewById(R.id.image_view_2);
    btn = findViewById(R.id.button);
    btn2 = findViewById(R.id.button2);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           Intent takePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
           if (camara.resolveActivity(getPackageManager()) != null) {
              startActivityForResult(takePhoto, IMAGE_REQUEST);
           }
        }
    });

    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           Intent takePhoto2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
           if (camara.resolveActivity(getPackageManager()) != null) {
              startActivityForResult(takePhoto2, IMAGE_REQUEST);
           }
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    if (requestCode == IMAGE_REQUEST) {
        if (resultCode == Activity.RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap photo = (Bitmap) extras.get("data");
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            photo.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
            byte[] image = outputStream.toByteArray();
            String imageB64 = Base64.encodeToString(image, Base64.DEFAULT);
        }
    }
    
    if (requestCode == IMAGE_REQUEST2) {
        if (resultCode == Activity.RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap photo2 = (Bitmap) extras.get("data");
            ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream();
            photoStatement.compress(Bitmap.CompressFormat.JPEG, 100, outputStream2);
            byte[] imagen2 = outputStream2.toByteArray();
            String image2B64 = Base64.encodeToString(imagen2, Base64.DEFAULT);
        }
    }
    
}

【问题讨论】:

  • 在尝试将全分辨率照片转换为 base64 时,您很有可能会耗尽内存。您可能无法将全分辨率照片加载为 byte[],更不用说进行转换了。

标签: android base64 android-camera


【解决方案1】:

我不想显示或保存照片,我只想把它转换成base64发送到我的数据库。

抱歉,如果您想要的不仅仅是现在获得的缩略图,您应该让使用过的相机应用程序将图片保存到文件中。 (不要为此乱用位图)。然后将文件作为 blob 放入数据库中。如果你把它 base64 编码到数据库中,你需要多 30% 的字节。

【讨论】:

    【解决方案2】:

    当您尝试从额外的数据意图中获取图像时,它会返回缩略图而不是捕获的真实/全尺寸图像。

    为了能够访问相机拍摄的真实图像,您应该使用 FileProvider,并通过其 URI 获取文件。

    如果您关注official documentation,您会发现它非常简单高效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多