1

画像を切り抜く方法を使用しようとしています。まさにこの方法:

private void performCrop() {
    try {
        //call the standard crop action intent (the user device may not support it)
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        //indicate image type and Uri
        cropIntent.setDataAndType(**HERE**, "image/*");
        //set crop properties
        cropIntent.putExtra("crop", "true");
        //indicate aspect of desired crop
        cropIntent.putExtra("aspectX", 1);
        cropIntent.putExtra("aspectY", 1);
        //indicate output X and Y
        cropIntent.putExtra("outputX", 256);
        cropIntent.putExtra("outputY", 256);
        //retrieve data on return
        cropIntent.putExtra("return-data", true);
        //start the activity - we handle returning in onActivityResult
        startActivityForResult(cropIntent, 1234);
    }
    catch(ActivityNotFoundException anfe){
        Log.d("debugging","EXCEPTION");/*
        //display an error message
        String errorMessage = "Whoops - your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();*/
    }
}

この行は、URIデータと文字列型を要求します。

    cropIntent.setDataAndType(**HERE**, "image/*");

しかし、私はこのビットマップを置きたいだけです

Bitmap fotoCreada;

データとして、しかし私はそれを行う方法がわかりません。

これを達成する方法はありますか?

ありがとう。

編集

さて、これは今の私のコードです:

ボタンがあります。クリックすると:

public void onClick(View v) {
            Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
            if(isSDPresent) {
                //Creem carpeta
                File folder = new File(Environment.getExternalStorageDirectory().toString()+"/pic/");
                folder.mkdirs();
                //Recuperem data actual
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
                String currentDateandTime = sdf.format(new Date());
                //Cridem a la camara.
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                resultingFile=new File(folder.toString() + "/"+currentDateandTime+".jpg");
                Uri uriSavedImage=Uri.fromFile(resultingFile);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
                //Començem activity
                startActivityForResult(cameraIntent, 1888); 
            } else {
                Toast toast = Toast.makeText(getActivity(), "Issues while accessing sdcard.", Toast.LENGTH_SHORT);
                toast.show();
            }
        }   

ご覧のとおり、startActivityForResultを呼び出しています。基本的に写真を撮り、activityResultで取得します。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("debugging",""+resultCode);
    if( requestCode == 1888 && resultCode == -1) { //-1 = TOT HA ANAT BE.
        Bitmap photo = BitmapFactory.decodeFile(resultingFile.getPath());
        Matrix matrix = new Matrix();
        matrix.postRotate(90);
        Bitmap photoRotated = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), matrix, true);
        this.fotoCreada=photoRotated;
        ((ImageView) myFragmentView.findViewById(R.id.fotoCapturada)).setImageBitmap(this.fotoCreada);
        try {
            FileOutputStream out = new FileOutputStream(this.resultingFile.getPath());
            this.fotoCreada.compress(Bitmap.CompressFormat.PNG, 90, out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        performCrop();
    }
    if (requestCode == 1234 && resultCode == -1){
        Bitmap bitmap = (Bitmap) data.getParcelableExtra("BitmapImage");
        Log.d("debugging",""+bitmap.getHeight());
    }
}

前のコードからわかるように、ビットマップを取得するときに、メソッドperformCropを呼び出します。現在のコードは次のとおりです。

private void performCrop() {
    try {
        //call the standard crop action intent (the user device may not support it)
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        //indicate image type and Uri
        //cropIntent.setDataAndType(this.picUri, "image/*");
        cropIntent.putExtra("BitmapImage", this.fotoCreada);
        //set crop properties
        cropIntent.putExtra("crop", "true");
        //indicate aspect of desired crop
        cropIntent.putExtra("aspectX", 1);
        cropIntent.putExtra("aspectY", 1);
        //indicate output X and Y
        cropIntent.putExtra("outputX", 256);
        cropIntent.putExtra("outputY", 256);
        //retrieve data on return
        cropIntent.putExtra("return-data", true);
        //start the activity - we handle returning in onActivityResult
        startActivityForResult(cropIntent, 1234);
        Log.d("debugging","he acabat performCrop");
    }
    catch(ActivityNotFoundException anfe){
        Log.d("debugging","EXCEPTION");
        //display an error message
        String errorMessage = "Whoops - your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}

ただし、performCropからのstartActivityForResultがonActivityResultを呼び出すことはありません。Log catは、1回だけ入力したので、2回入力する必要があると言っています。1つ目はカメラアクティビティから、2つ目はクロップアクティビティからです。

-1
he acabat performCrop

それが十分に明確であることを願っています。

ありがとう。

4

2 に答える 2

2

Bitmap実装Parcelableするので、いつでもインテントに渡すことができます:

Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("BitmapImage", bitmap);

もう一方の端でそれを取得します。

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");

ただし、ビットマップがファイルまたはリソースとして存在する場合は、ビットマップ自体ではなく、ビットマップの URI または ResourceID を渡す方が常に適切です。ビットマップ全体を渡すには、大量のメモリが必要です。URL の受け渡しに必要なメモリは非常に少なく、各アクティビティは必要に応じてビットマップを読み込んでスケーリングできます。

于 2013-01-20T20:37:49.820 に答える
0

Intent.putExtra を使用します。ビットマップはパーシーブルであるため、機能します。setDataAndType は URI に使用されますが、Web またはディスク上のリソースを参照していません。

于 2013-01-20T20:37:14.780 に答える