java - 从相机 Intent 拍摄照片并在其上覆盖另一个小图像

标签 java android image-processing bitmap camera

我现在有一个应用程序,只需单击按钮即可打开相机。然后用户可以使用标准相机应用程序拍照,这会导致取消/保存选项。如果选择取消,则可以重新拍照。如果选择“保存”选项,图像将保存到图库中。我想在单击任何一个之前在此“取消/保存”模式下向图像添加一些内容。

我认为最好的方法是将照片导入我的应用程序并在那里进行修改并使用按钮保存。我不知道该怎么做。我知道我必须使用 onActivityResult 函数,但仅此而已。

如有任何建议,我们将不胜感激。

最佳答案

当您启动 IMAGE_CAPTURE Intent 让用户拍照时,您应该将存储图像的路径作为参数传递。 首先,您应该保存所拍摄图片的路径,然后,当用户返回您的 Activity 时,管理位图并与其他元素组合。

  camera.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    String storageState = Environment.getExternalStorageState();
                    if (storageState.equals(Environment.MEDIA_MOUNTED)) {
                        long time = System.currentTimeMillis();

                        File root = Environment
                                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

                        File dir = new File(root.getAbsolutePath() + "/Camera");
                        if (dir.exists() == false) {
                            dir.mkdirs();
                        }

                        String path = dir.getAbsolutePath() + File.separatorChar
                                + time + ".jpg";
                        filesaved = new File(path);
                        try {
                            if (filesaved.exists() == false) {
                                filesaved.getParentFile().mkdirs();
                                filesaved.createNewFile();
                            }

                        } catch (IOException e) {
                            Toast.makeText(
                                    context,
                                    "Unable to create external file"
                                            + storageState, Toast.LENGTH_LONG).show();
                            return;
                        }


                        uritopass = Uri.fromFile(filesaved);
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, uritopass);
                        startActivityForResult(intent, TAKE_PICTURE);
                    } else {
                        Toast.makeText(
                                context,
                                "External Storeage (SD Card) is required.\n\nCurrent state: "
                                        + storageState, Toast.LENGTH_LONG).show();

                    }
                }

            });

    ...
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == TAKE_PICTURE) {
                //user took a photo
                File imageFile = new File(filesaved.toString());
                Bitmap bm = decodeFile(imageFile);
                if (bm != null) {
                    bm = combineImages(bm);
                    img.setImageBitmap(bm);
                }
            }
        }
}

...

decodefile 方法从原始文件加载位图 Here .

combineImages 方法组合 2 个或更多位图 Here .

关于java - 从相机 Intent 拍摄照片并在其上覆盖另一个小图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14569303/

相关文章:

java - 为 SonarPython 编写一个插件

php - 随机生成问题在 Android 应用程序中不起作用

opengl - 处理大量图像

java - JsonPath 表达式来过滤属性并选择部分记录?

java - 尝试通过 Lambda : No address associated with hostname 连接到 Atlas

java - 如何从 ArrayList 中获取相等或接近相等数量的具有不同字段值的对象

android - 自定义评级栏仅显示一颗星

Android 不使用设备宽度和高度创建运行时 View

matlab - 如何获得图像中使用的1D和2D空间滤波器的光谱?

php - 如何动态创建带有指定编号的图像?