2016-12-27 12 views
0

私はカメラの意図を使って、ユーザーが画像を撮ってFirebaseストレージに画像をアップロードできるようにしています。私はこのプロセスの間に、実際のイメージファイルではなくビットマップを引っ張っているので、かなりのイメージ品質が失われていることに気付いています。私は明らかにファイルサイズを制限し、必要な場所で圧縮したいと思いますが、元の画質も保持したいと思います。私はカメラの意図を呼び出し、写真を撮るようにユーザに促すのはここです:画像をロードする(ビットマップサムネイルではない)Android Camera Intentから

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に保存します。ここでは

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()メソッドであります:

ここ
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); 
     } 
    }); 

} 
+0

あなたは完全なイメージを取得していません、あなたはただ問題を直面しているためにそれをキャプチャするイメージのサムネイルを再取得しています。 ビットマップimageBitmap =(ビットマップ)extras.get( "data"); –

+0

別の方法で画像を取得しよう –

+0

完全な画像を取得するにはどうすればよいですか?何を追加すればよいですか? – tccpg288

答えて

2

、品質=>私たちは私たちの絵が1の規模で持つようにしたい品質 - 100 targetWidth & targetHeight =>このGIVあなたは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)); 
    }); 
} 
+0

これはカメラの意図を使用しないのですか?プロセス中に「OK」または「キャンセル」と言うようにユーザに促すので、カメラの意図が最も簡単だと感じます。 – tccpg288

+0

アラートダイアログを使用します... –

+0

インテントはビットマップのみを返しますか? – tccpg288

1

外部のカメラアプリを使ってAndroidの中で写真を撮るために、Googleのチュートリアルはこれです:あなたがその例に従うならば、あなたはカメラアプリが画像データを保存するファイルを作成しています

https://developer.android.com/training/camera/photobasics.html 。画像の品質を失いたくない場合は、そのファイルの内容を直接アップロードしてください。現状では、イメージのサムネイルをアップロードしています。イメージのサムネイルは、ソースイメージのサイズと品質の近くにはありません。

関連する問題