2

私のアプリケーションでは、カメラを開いて写真を撮ることができます。画像は 2448x3264 ピクセルのフルサイズで SD カードに保存されます。画像を 2448x3264 ピクセルではなく 90x90 ピクセルのサイズで保存するには、アプリケーションでこれを構成するにはどうすればよいですか?

カメラを開いて画像をキャプチャするには、次の方法を使用します。

/*
 * Capturing Camera Image will lauch camera app requrest image capture
 */
private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // start the image capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}

private Uri getOutputMediaFileUri(int type) {
    return Uri.fromFile(getOutputMediaFile(type));
}

private File getOutputMediaFile(int type) {
    // External sdcard location
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory
            (Environment.DIRECTORY_PICTURES), IMAGE_DIRECTORY_NAME);

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " + IMAGE_DIRECTORY_NAME + " directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
    } 
    else {
        return null;
    }

    return mediaFile;
}

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // if the result is capturing Image
        if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

/*              
                try {
                    decodeUri(this, fileUri, 90, 90);
                } catch (FileNotFoundException e) {

                    e.printStackTrace();
                }
*/

                // successfully captured the image
                Toast.makeText(getApplicationContext(), 
                        "Picture successfully captured", Toast.LENGTH_SHORT).show();
            } else if (resultCode == RESULT_CANCELED) {
                // user cancelled Image capture
                Toast.makeText(getApplicationContext(), 
                        "User cancelled image capture", Toast.LENGTH_SHORT).show();
            } else {
                // failed to capture image
                Toast.makeText(getApplicationContext(),
                        "Sorry! Failed to capture image", Toast.LENGTH_SHORT).show();
            }
        } 
    }   

public static Bitmap decodeUri(Context c, Uri uri, final int requiredWidth, final int requiredHeight) throws FileNotFoundException {

        BitmapFactory.Options o = new BitmapFactory.Options();

        o.inJustDecodeBounds = true;

        BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, o);

        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;

        while(true) {
            if(width_tmp / 2 < requiredWidth || height_tmp / 2 < requiredHeight)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, o2);
    }  

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        // get the file url
        fileUri = savedInstanceState.getParcelable("file_uri");
    }

これで私を助けてくれることを願っています。キャプチャした画像を小さなイメージビューにロードしようとしています。そのように見えます。前もって感謝します

4

4 に答える 4

1

MediaStore.ACTION_IMAGE_CAPTUREいいえ、 Intentを使用する場合、画像サイズを制御することはできません。「カスタムカメラ」を実装すれば、これを実現できます(そして、インターネット上にはたくさんの実用的なサンプルがあります)

で受信したバイト配列はonPictureTaken()Jpeg バッファです。画像操作については、この Java パッケージを参照してください: http://mediachest.sourceforge.net/mediautil/ ( GitHubに Android ポートがあります)。JPEG をビットマップにデコードして元に戻すことなく、縮小する非常に強力で効率的な方法があります。

于 2014-02-12T13:39:15.673 に答える
0

ここでは、撮影した写真の SDCard に保存されたパスを取得し、必要なサイズの画像をビットマップとして返​​すメソッドを提供しています。あとは、SDCard にイメージ パスを渡して、サイズ変更されたイメージを取得するだけです。

private Bitmap processTakenPicture(String fullPath) {

    int targetW = 90; //your required width
    int targetH = 90; //your required height

    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(fullPath, bmOptions);

    int scaleFactor = 1;
    scaleFactor = calculateInSampleSize(bmOptions, targetW, targetH);

    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor * 2;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(fullPath, bmOptions);

    return bitmap;
}

private 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;
}
于 2014-02-11T11:42:48.867 に答える
0

元の画像を読んだら、次を使用できます。

 Bitmap.createScaledBitmap(photo, width, height, true);
于 2014-02-11T11:44:37.850 に答える