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

我一直在做一个相机的应用程序,一切正在与拍摄和保存图片。 但是我想在拍摄的时候将图片保存在实际的图片中时显示出来。 那可能吗?

现在我一直在试图在相同的布局与我绘制相机预览的地方。

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

我想也许如果是和相机一样的画面,那么它也会和图片一起看到这个图像。

有谁知道这是可能的,还是我必须采取另一种方法? 如果是这样,链接到其他解决scheme如何做到这一点将不胜感激:)

谢谢!

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

编辑2:为了说明起见,我想让这个例子中的明星在拍摄后显示在拍摄的照片中。 所以,如果我拍一张墙的照片,那么当你在画廊里看照片的时候,我希望这个明星在墙上展示,就像拍照时一样!

Solutions Collecting From Web of "Android将图像添加到用相机拍摄的照片"

你真正想要的是一个LayerDrawable –

pipe理一系列其他Drawable的Drawable。 这些按照数组顺序绘制,所以具有最大索引的元素将被绘制在最上面。

你有两个select使用LayerDrawable 。你可以定义它在一个单独的可绘制的XML,然后简单地在您的ImageView设置图像,或者您可以在您的代码dynamicconfiguration一个LayerDrawable然而,正如你想要这种dynamic发生,你需要下面提到的编程方法。

以编程方式使用代码

您需要将您的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)。

编辑

如果您想要将新创build的图像(添加了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"); 

现在通过像上面这样做,你的图像将被添加到图库的最后。如果你想要它被存储在图库的开始, 请参考这个代码 。

如果您想要在图片库中存储的原始图片在您点击图片后从图库中删除,您可以参考这个问题 。在这个问题中,您将看到类似file.getPath()东西,它是只不过是要删除所需图像的path。所以如果你想获得捕获的图像的path, 请参考这个SO问题 。现在,你有你的每一个想法,实现你想要的东西。

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

使用XML

创build一个新的可绘制的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> 

现在在您的Activity使用该Drawable设置图像:

 imageView.setImageDrawable(getResources().getDrawable(R.layout.mylayer)); 

我会这样做。 适用于我:

 @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" /> 

希望这可以帮助 :)

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

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

希望解决你的问题。