【问题标题】:Load Image (Not Bitmap Thumbnail) From Android Camera Intent从 Android 相机意图加载图像(不是位图缩略图)
【发布时间】:2017-05-11 19:04:01
【问题描述】:

我正在使用相机 Intent 允许用户拍照并将图像上传到 Firebase 存储。我注意到在此过程中,由于我拉的是位图而不是实际的图像文件,因此会丢失相当多的图像质量。我显然想限制文件大小并在必要时进行压缩,但我也想保留原始图像质量。这是我调用相机意图并提示用户拍照的地方:

 case 1:
          Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          if (takePictureIntent.resolveActivity(getApplication().getPackageManager()) != null) {
          startActivityForResult(takePictureIntent, TAKE_PICTURE);
         } else {Toast.makeText(getApplicationContext(), getResources().getString(R.string.camera_error), Toast.LENGTH_LONG).show();
                            }
         break;

这是我检索图像数据的 .onActivityResult() 方法:

  case TAKE_PICTURE:
            //TODO: Limit file size to prevent reaching Firebase storage limit
            if (resultCode == CreateActivity.RESULT_OK) {
                Bundle extras = data.getExtras();
                Bitmap imageBitmap = (Bitmap) extras.get("data");
                mImagePreview.setDrawingCacheEnabled(true);
                mImagePreview.buildDrawingCache();
                mImagePreview.setImageBitmap(imageBitmap);
                encodeBitmapAndSaveToFirebase(imageBitmap);
            }
            break;

并保存到 Firebase:

private void encodeBitmapAndSaveToFirebase(Bitmap bitmap) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] data = baos.toByteArray();

    String uniqueID = java.util.UUID.randomUUID().toString();
    mFileRef = mStorageRef.child(uniqueID);
    UploadTask uploadTask = mFileRef.putBytes(data);
    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            Toast.makeText(getApplicationContext(), "Error Loading Photo", Toast.LENGTH_LONG).show();
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
            Uri downloadUrl = taskSnapshot.getDownloadUrl();
            resultImageURL = downloadUrl.toString();
            Picasso.with(getApplicationContext())
                    .load(resultImageURL)
                    .into(mImagePreview);
        }
    });

}

【问题讨论】:

  • 你没有得到完整的图像,你只是得到了缩略图,它只是 retunt 图像的缩略图,你捕获的就是你面临的问题 Bitmap imageBitmap = (Bitmap) extras.get("data");
  • 尝试其他方式获取图片
  • 如何获取完整图像?我要额外使用什么?

标签: android image firebase android-camera firebase-storage


【解决方案1】:

这里,质量 => 我们希望我们的图片在 1 到 100 的范围内具有的质量。 targetWidth & targetHeight => 这会为您提供以 px 为单位的图像大小。

takePicture(){
  Camera.getPicture({
   quality : 95,
   destinationType : Camera.DestinationType.DATA_URL,
   sourceType : Camera.PictureSourceType.CAMERA,
   allowEdit : true,
   encodingType: Camera.EncodingType.PNG,
   targetWidth: 500,
   targetHeight: 500,
   saveToPhotoAlbum: true
 }).then(imageData => {
   this.guestPicture = imageData;
 }, error => {
   console.log("ERROR -> " + JSON.stringify(error));
  });
}

【讨论】:

  • 所以这不使用相机意图?我觉得相机意图是最简单的,因为它会在过程中提示用户说“确定”或“取消”....
  • intent 是否只返回位图?
  • 这段代码看起来像 JavaScript。问题是关于Android的,给出的示例代码是Java。
【解决方案2】:

使用外部相机应用在 Android 中拍照的 Google 教程是这样的:https://developer.android.com/training/camera/photobasics.html

如果您遵循该示例,您将创建一个文件,相机应用将在其中保存图像数据。如果您不想丢失图像的任何质量,请直接上传该文件的内容。就目前而言,您正在上传图片的缩略图,这与源图片的大小和质量相去甚远。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多