0

私は、Androidカメラアプリで撮影した写真にテキスト(「hola」)を追加し、その画像をSDカードに保存するこのシンプルなアプリを改善しようとしています。

しかし、返されたデータからサムネイル画像にテキストを追加し、ファイルをSDカードに保存することしかできませんでした。

フルサイズの写真でまったく同じことをするために、誰かが私を正しい方向に向けることができますか?

どうもありがとう!!

私がこれまでに持っているもの:(チュートリアルのコードとstackoverflowに関する同様の質問への回答を使用して)

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

    Button captureBtn = (Button)findViewById(R.id.capture_btn);
    captureBtn.setOnClickListener(this);

}

public void onClick(View v) {
    if (v.getId() == R.id.capture_btn) {

        try {
            Intent tomaFotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(tomaFotoIntent, CAMERA_CAPTURE);
        } 
        catch(ActivityNotFoundException anfe){
            String errorMessage = "Device doesn't support capturing images";
            Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    }
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        //user is returning from capturing an image using the camera
        if(requestCode == CAMERA_CAPTURE){
            //get the Uri for the captured image
            picUri = data.getData();
            //get the returned data
            Bundle extras = data.getExtras();
            //get the cropped bitmap
            Bitmap thePic = extras.getParcelable("data");
            //agregamos texto
            bmConTexto = writeTextOnDrawable(thePic, "hola");

            //guardamos la nueva imagen
            saveBitmap(bmConTexto.getBitmap());

            //retrieve a reference to the ImageView
            ImageView picView = (ImageView)findViewById(R.id.picture);
            //display the returned cropped image
            picView.setImageBitmap(bmConTexto.getBitmap());
        }
    }
}

private BitmapDrawable writeTextOnDrawable(Bitmap thePic, String text) {

    Bitmap bm = thePic.copy(Bitmap.Config.ARGB_8888, true);
    Typeface tf = Typeface.create("Helvetica", Typeface.BOLD);

    Paint paint = new Paint();
    paint.setStyle(Style.FILL);
    paint.setColor(Color.WHITE);
    paint.setTypeface(tf);
    paint.setTextAlign(Align.CENTER);
    paint.setTextSize(20);

    Rect textRect = new Rect();
    paint.getTextBounds(text, 0, text.length(), textRect);

    Canvas canvas = new Canvas(bm);
    //Calculate the positions
    int xPos = (canvas.getWidth() / 2) - 2;     //-2 is for regulating the x position offset
    //"- ((paint.descent() + paint.ascent()) / 2)" is the distance from the baseline to the center.
    int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ;  
    canvas.drawText(text, xPos, yPos, paint);
    return new BitmapDrawable(getResources(), bm);


}

public void saveBitmap(Bitmap bm)
{
    try
    {
        String mBaseFolderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera/";
        String mFilePath = mBaseFolderPath + "abcd.jpg";

        FileOutputStream stream = new FileOutputStream(mFilePath);
        bm.compress(CompressFormat.JPEG, 100, stream);
        stream.flush();
        stream.close();
    }
    catch(Exception e)
    {
        Log.e("Could not save", e.toString());
    }
}
4

2 に答える 2

1

写真を撮って「Hola」と書こうとしているようですが、その場合はtakePicture()AndroidカメラのAPIを調べてみましたか?そうでない場合は、質問を詳しく説明できますか?

編集:上のリンクのページの上部から貼り付けました:

このクラスで写真を撮るには、次の手順を使用します。

  1. open(int)からCameraのインスタンスを取得します。
  2. getParameters()を使用して既存の(デフォルトの)設定を取得します。
  3. 必要に応じて、返されたCamera.Parametersオブジェクトを変更し、setParameters(Camera.Parameters)を呼び出します。
  4. 必要に応じて、setDisplayOrientation(int)を呼び出します。
  5. 重要:完全に初期化されたSurfaceHolderをsetPreviewDisplay(SurfaceHolder)に渡します。サーフェスがないと、カメラはプレビューを開始できません。
  6. 重要:startPreview()を呼び出して、プレビューサーフェスの更新を開始します。写真を撮る前にプレビューを開始する必要があります。
  7. 必要に応じて、takePicture(Camera.ShutterCallback、Camera.PictureCallback、Camera.PictureCallback、Camera.PictureCallback)を呼び出して写真をキャプチャします。コールバックが実際の画像データを提供するのを待ちます。
  8. 写真撮影後、プレビュー表示が停止します。さらに写真を撮るには、最初にもう一度startPreview()を呼び出します。
  9. stopPreview()を呼び出して、プレビューサーフェスの更新を停止します。
  10. 重要:release()を呼び出して、他のアプリケーションで使用できるようにカメラを解放します。アプリケーションは、onPause()でカメラをすぐに解放する必要があります(そして、onResume()でカメラをre-open()します)。
于 2012-12-25T17:27:25.593 に答える
0

あなたのコードは正しいようですか?あなたが直面している問題は何ですか?カメラのサムネイルサイズから取得している画像ですか?あなたは使用してみることができます

Bitmap thePic = (Bitmap) data.getExtras().get("data"); 

それ以外の

Bitmap thePic = extras.getParcelable("data");

更新:
BitmapDrawableを返す代わりに、ビットマップ自体を直接返し、確認することができます。最後の行を次のように変更するだけです

return bm;
于 2012-12-25T18:02:37.743 に答える