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

时间:2014-09-09 11:20:12

标签: android camera android-camera

我一直在制作相机应用程序,一切都在处理并保存图片。但是我希望在拍摄照片时将照片保存在实际照片中时显示我的Imageview。这可能吗?

现在我一直在尝试将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 个答案:

答案 0 :(得分:5)

您最想要的是LayerDrawable -

  

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

您有两种选择可以使用LayerDrawable。您可以在单独的可绘制xml中定义它,然后只需在ImageView中设置图像,也可以动态配置LayerDrawable在您的代码中。但是,如果您希望动态发生这种情况,则需要采用下面提到的编程方法。

以编程方式使用代码

您需要将Bitmap(拍摄照片后必须获得的照片)转换为Drawable。对于此用途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_big_on)。

修改

如果您想将新创建的图像(添加了2个图像)存储在图库中,您可以执行以下操作来存储图像:

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");

现在通过上面的操作,您的图片将被添加到图库的末尾。如果您希望将其存储在图库的开头,refer this code

如果您想要在点击照片后立即存储在图库中的原始图片,要从图库中删除,您可以refer this SO question。在此问题中,您会看到类似{{1}的内容},这只是要删除所需图像的路径。所以,如果你想获得捕获图像的路径,refer this SO question。希望现在你可以随心所欲地实现你想要的东西。

注意:如果您想知道如何通过XML使用file.getPath()

使用XML

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

LayerDrawable

现在,您<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> 使用Activity

设置图片
Drawable

答案 1 :(得分:0)

我会这样做。适合我:

@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:"));
    }

不要忘记在onCreate方法中声明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" />

希望这会有所帮助:)

答案 2 :(得分:0)

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

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;
} 

希望能解决您的问题。