1

カメラで撮影した写真を拡大縮小しようとしていますが、どこでどのように行うかわかりません。現在、コードはカメラにアクセスし、写真を撮ってリストビューに表示しています。写真のパスも取得したいのですが、これを行う方法もわかりません。どんな助けでも大歓迎です。

/**
     * This function is called when the add player picture button is clicked.
     * It accesses the devices gallery and the user can choose a picture
     * from the gallery.
     * Or if the user chooses to take a picture with the camera, it handles that
     */

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case TAKE_PICTURE:
            if (resultCode == Activity.RESULT_OK) {
                Uri selectedImage = imageUri;
                getContentResolver().notifyChange(selectedImage, null);
                ContentResolver cr = getContentResolver();
                this.picPath = selectedImage.getPath();
                Bitmap bitmap;
                try {
                     bitmap = android.provider.MediaStore.Images.Media
                     .getBitmap(cr, selectedImage);
                    imageView = (ImageView) findViewById(R.id.imagePlayer); 
                    imageView.setImageBitmap(bitmap);
                    Toast.makeText(this, selectedImage.toString(),
                            Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
                            .show();
                    Log.e("Camera", e.toString());
                }
            }

ありがとう

4

1 に答える 1

2

ビットマップ画像を取得したら、Bitmap クラスの createScaledBitmap 静的メソッドを使用できます

   Bitmap.createScaledBitmap(yourBitmap, 50, 50, true); // Width and Height in pixel e.g. 50

しかし、将来的に極端なメモリ不足の状態になると... 注意しないと、ビットマップが使用可能なメモリ バジェットをすぐに消費し、恐ろしい例外が原因でアプリケーションがクラッシュする可能性があります: java.lang.OutofMemoryError: ビットマップ サイズが VM バジェットを超えています。

したがって、 java.lang.OutOfMemory 例外を回避するには、ビットマップをデコードする前にサイズを確認してください。ただし、ソースが、使用可能なメモリ内に収まる予測可能なサイズの画像データを提供すると完全に信頼している場合を除きます。

  // below 3 line of code will come instead of 
//imageView.setImageBitmap(bitmap);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();         
    photo.compress(Bitmap.CompressFormat.JPEG,100,stream);
    imageView.setImageBitmap(decodeSampledBitmapFromByte(stream.toByteArray(),50,50));  

BitmapFactory クラスは、さまざまなソースからビットマップを作成するためのいくつかのデコード メソッド (decodeByteArray()、decodeFile()、decodeResource() など) を提供します。画像データ ソースに基づいて、最適なデコード方法を選択します。これらのメソッドは、構築されたビットマップにメモリを割り当てようとするため、OutOfMemory 例外が簡単に発生する可能性があります。デコード メソッドの各タイプには、BitmapFactory.Options クラスを介してデコード オプションを指定できる追加のシグネチャがあります。デコード時に inJustDecodeBounds プロパティを true に設定すると、メモリ割り当てが回避され、ビットマップ オブジェクトに対して null が返されますが、outWidth、outHeight、および outMimeType が設定されます。この手法を使用すると、ビットマップの構築 (およびメモリ割り当て) の前に、イメージ データのサイズとタイプを読み取ることができます。

 // please define following two methods in your activity
    public Bitmap decodeSampledBitmapFromByte(byte[] res,
                int reqWidth, int reqHeight) {

            // First decode with inJustDecodeBounds=true to check dimensions
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeByteArray(res, 0, res.length,options);

            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeByteArray(res, 0, res.length,options);
        }
         public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
            // Raw height and width of image
            final int height = options.outHeight;
            final int width = options.outWidth;
            int inSampleSize = 1;

            if (height > reqHeight || width > reqWidth) {
                if (width > height) {
                    inSampleSize = Math.round((float)height / (float)reqHeight);
                } else {
                    inSampleSize = Math.round((float)width / (float)reqWidth);
                }
            }
            return inSampleSize;
        }

また、Android トレーニングの次のリンクを参照してください。ビットマップに関連する java.lang.OutofMemoryError : ビットマップ サイズが VM の予算を超えています

于 2012-09-10T14:33:24.233 に答える