当前位置: 首页 > 知识库问答 >
问题:

如何在android中保存自定义大小的拍摄图像

曾喜
2023-03-14

在我的应用程序中,我可以打开相机并拍照。图片以2448x3264像素的全尺寸存储在sd卡上。我如何在我的应用程序中配置它,以保存90x90像素而不是2448x3264像素的图片?

要打开相机并拍摄图像,我使用以下方法:

/*
 * 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");
    }

我希望s. o.能帮助我。我正在尝试将捕获的图像加载到一个小图像视图中,看起来像这样。提前感谢

共有3个答案

黄丰
2023-03-14

阅读原始图像后,您可以使用:

 Bitmap.createScaledBitmap(photo, width, height, true);
丌官嘉良
2023-03-14

在这里,我给出了一个方法,它将拍摄图片的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;
}
蓬祺
2023-03-14

不,使用MediaStore时无法控制图片大小。ACTION\u IMAGE\u捕获Intent。如果你实现你的“定制相机”(互联网上有很多工作示例),包括我的,你就可以实现这一点。

在onPictureTaken()中接收的字节数组是一个Jpeg缓冲区。看看这个用于图像处理的Java包:http://mediachest.sourceforge.net/mediautil/(GitHub上有一个Android端口)。有非常强大和有效的方法来缩小Jpeg,而无需将其解码为位图并返回。

 类似资料:
  • 问题内容: 我环顾四周,但似乎并没有解决这个非常恼人的问题的可靠答案。 我以纵向拍摄照片,然后单击“保存/放弃”,按钮也以正确的方向放置。问题是当我随后在横向上检索图像时(图像已逆时针旋转90度) 我不想强迫用户以特定方向使用相机。 有没有办法检测照片是否以人像模式拍摄,然后解码位图并将其向上翻转? 问题答案: 照片始终以相机内置在设备中的方向拍摄。为了使图像正确旋转,您必须读取存储在图片中的方向

  • 问题内容: 我想将-object 保存到Android存储中的某个位置以快速检索并在其中显示数据。 这可能吗?如果可以,那么SQLite或外部存储适合哪种技术? 问题答案: 例。 并从活动中致电 不要忘记在清单文件中使用write_external_storage权限。

  • 问题内容: 我已经在此问题上停留了一段时间,并查看了各种教程以寻求帮助,但尚未成功。 我实质上已经在我的 应用程序中 利用了该功能来 拍照 并显示它, 但是 它无法保存拍照。 这是包含我试图使其根据教程发挥作用的代码: 我已经在文件中包含了所有必要的内容。 问题答案: File imagesFolder = new File(Environment.getExternalStorageDirect

  • 我正在开发一个应用程序,在这个应用程序中,我以纵向方向拍摄照片,问题是当我稍后检索图像时,它是横向方向的(图片已逆时针旋转90度)。我曾经在课下使用过,但这里每次都是0(零)。所以,我不知道怎么解决它。

  • 我需要在数据库中按kb保存大小,以便在前端查看,这是我正在使用的控制器。我使用的是Laravel 5.8 所以我的问题是,拉雷维尔是否提供了处理这种情况的任何假象?或者任何其他框架都有更适合问题的功能是什么?

  • 我创建了自定义相机活动,但拍摄的图像方向错误。当我在纵向模式下拍摄图像并将其旋转90度后。它处于原始位置,但在横向模式下以错误方向拍摄图像。 相机方向在纵向模式下捕获图像时 用于解决相机预览问题。 检查位图方向。