我一直在制作相机应用程序,一切都在处理并保存图片。但是我希望在拍摄照片时将照片保存在实际照片中时显示我的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:为了澄清,我希望你拍摄后,这个例子中的星星会在拍摄的照片中显示出来。因此,如果我拍摄一张墙的照片,我希望之后看到画廊中的照片时,就会在拍摄照片的时候将星显示在墙上!
答案 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;
}
希望能解决您的问题。