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

Android添加图像到相机拍摄的照片

田德馨
2023-03-14

我一直在开发一个摄像头应用程序,所有的工作都是拍摄和保存照片。但我希望在拍摄照片时显示的Imageview能够保存在实际拍摄的照片中。可能吗?

现在,我一直试图让图像视图与我绘制相机预览的布局相同。

<FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    >

    <ImageView
        android:layout_width="50pt"
        android:layout_height="50pt"
        android:layout_gravity="center"
        android:src="@android:drawable/star_big_on"
        />

</FrameLayout>

我想,也许如果它画在与相机相同的视图上,那么它也会看到图像和照片。

有没有人知道这是否可能,或者我必须采取另一种方法?如果是这样,链接到其他解决方案如何做到这一点将不胜感激:)

谢谢

编辑:我一直遵循这个相机教程http://developer.android.com/guide/topics/media/camera.html#manifest如果有人想知道我如何保存图片等

Edit2:为了澄清,我希望在你拍摄后,这个例子中的星星能在照片中显示出来。所以,如果我拍了一张墙的照片,我希望当你在画廊里看照片时,星星会出现在墙上,就像拍照片时一样!

共有3个答案

夏华藏
2023-03-14

也许叠加方法可以帮助你。捕获图像后,将其转换为位图,然后将捕获图像和要保存的图像发送到此方法:

private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(),   bmp1.getConfig());
    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bmp1, new Matrix(), null);
    canvas.drawBitmap(bmp2, new Matrix(), null);
    return bmOverlay;
} 

希望能解决你的问题。

陆宾白
2023-03-14

我会这样做的。为我工作:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == REQUEST_IMAGE_CAPTURE) {
            if (resultCode == getActivity().RESULT_OK) {
                // successfully captured the image
                // display it in image view
                previewCapturedImage();
            } else if (resultCode == getActivity().RESULT_CANCELED) {
                // user cancelled Image capture
                Toast.makeText(getActivity().getApplicationContext(), "User cancelled image capture", Toast.LENGTH_SHORT).show();

            } else {
                // failed to capture image
                Toast.makeText(getActivity().getApplicationContext(),"Sorry! Failed to capture image", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void previewCapturedImage() {
        try {

            // bitmap factory
            BitmapFactory.Options options = new BitmapFactory.Options();

            // downsizing image as it throws OutOfMemory Exception for larger
            // images
            options.inSampleSize = 8;

            final Bitmap bitmap = BitmapFactory.decodeFile(imageUri.getPath(),options);
            toto.setImageBitmap(bitmap);
            shareCapturedImage();
        } catch (NullPointerException e) {
            e.printStackTrace();
            cam.release();
        }
    }

    private void shareCapturedImage() {
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("image/*");
        share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mediaFile));
        startActivity(Intent.createChooser(share,"Share with:"));
    }

别忘了在onCreative方法中声明ImageView,如下所示:

ImageView img = (ImageView) rootView.findViewById(R.id.img);

xml与此类似:

<ImageView
    android:id="@+id/img"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" />

希望这有帮助:)

沈飞跃
2023-03-14

您真正想要的是一个可分层绘制的-

管理其他Drawable数组的Drawable。这些是按数组顺序绘制的,因此具有最大索引的元素将绘制在顶部。

您有两种选择可以使用LayerDrawable。您可以在单独的可绘制xml中定义它,然后在ImageView中简单地设置图像,也可以在代码中动态配置一个LayerDrawable。然而,由于您希望动态地实现这一点,因此需要下面提到的编程方法。

以编程方式使用代码

您需要将您的位图(您必须在捕获图片后获得)转换为可绘制的代码。对于这样使用BitmapDrawable

Resources r = getResources();
Drawable d = new BitmapDrawable(r,yourBitmap);//converting bitmap to drawable    
Drawable[] layers = new Drawable[2];
layers[0] = d;
layers[1] = r.getDrawable(R.drawable.star_big_on);
LayerDrawable layerDrawable = new LayerDrawable(layers);
imageView.setImageDrawable(layerDrawable);

现在,您的ImageView上设置了两个图像(1.您拍摄的图像和2.star\u big\u on)。

编辑

由于您希望将新创建的图像(其中添加了两个图像)存储在库中,您可以执行以下操作来存储图像:

int width = layerDrawable.getIntrinsicWidth();
int height = layerDrawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap); 
layerDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
layerDrawable.draw(canvas);
//and then the following line will store it in the gallery
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap , "yourTitle" , "yourDescription");

现在,通过像上面这样做,您的图像将被添加到画廊的末尾。如果您希望它存储在库的开始部分,请引用此代码。

如果您希望在单击照片后存储在图库中的原始图像从图库中删除,您可以参考此问题。在这个问题中,您将看到类似于文件的内容。getPath(),它只是要删除的所需映像的路径。因此,如果您想获得捕获图像的路径,请参考此So问题。希望你现在有了所有的想法来实现你真正想要的。

注意:如果您想知道如何通过XML使用LayerDrawable

使用XML

创建一个新的Drawable XML文件,我们称之为mylayer.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/yourcapturedimage" />
   <item android:drawable="@drawable/star_big_on" />
</layer-list>

现在,在您的活动中使用该可绘制设置图像:

imageView.setImageDrawable(getResources().getDrawable(R.layout.mylayer));
 类似资料:
  • 所以我遇到了一个问题,前面在我提问的问题中提到过:将图像(ACTION_image_CAPTURE)上载到Firebase存储 我对这个问题进行了更多的搜索,并应用了Android Studio文档:https://developer.android.com/training/camera/photobasics.html#TaskPhotoView 所以,在您阅读代码之前,我基本上想说一下需要什

  • 本文向大家介绍Android调用系统照相机拍照与摄像的方法,包括了Android调用系统照相机拍照与摄像的方法的使用技巧和注意事项,需要的朋友参考一下 前言   在很多场景中,都需要用到摄像头去拍摄照片或视频,在照片或视频的基础之上进行处理。但是Android系统源码是开源的,很多设备厂商均可使用,并且定制比较混乱。一般而言,在需要用到摄像头拍照或摄像的时候,均会直接调用系统现有的相机应用,去进行

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

  • 在我的应用程序中,用户从相机捕获图像或从图库中选择图像,然后将其转换为pdf并上载到服务器,现在我的问题是,从相机捕获的图像在某些设备上旋转,我有代码尝试解决此问题,但它不起作用 任何建议或问题在哪里,没有错误代码或任何东西

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

  • 我是Android Studio的新手。我想通过点击按钮用手机摄像头拍摄照片,然后显示拍摄的照片,照片将自动保存在手机图库中。我在网上找到了一些例子,但我拍摄的照片没有保存在图库中。我已经使用了下面的代码。我能得到一些帮助吗?