Android adding image to picture taken with camera

Refresh

November 2018

Views

2.4k time

8

I have been working on a camera app and everything is working with taking and saving the picture. But I would like to have the Imageview I show when taking the picture to be saved in the actual picture when it is taken. Is that possible?

Right now I have been trying to have the imageView in the same Layout as where I draw the camera preview.

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

I thought that maybe if it was drawn on the same view as the camera is then it would also saw that image together with the picture.

Does anyone know if this is possible or do I have to take another approach? If so, links to other solutions on how to do this would be appreciated :)

Thanks!

Edit: I have been following this camera tutorial http://developer.android.com/guide/topics/media/camera.html#manifest If anyone is wondering how I save the picture etc

Edit2: For clarification, I want the star in this example to be shown in the taken picture after you take it. So if I take a picture of a wall, I want the star to be shown on that wall when you look at the picture in the gallery afterwards, just as it is when taking the picture!

3 answers

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

Надежда, чтобы решить вашу проблему.

5

То , что вы точно хотите это LayerDrawable -

Растяжимой, который управляет множество других вводимого коэффициента. Они рисуются в порядке массива, так что элемент с наибольшим индексом будет обращено на вершине.

У вас есть два варианта , чтобы использовать LayerDrawable.ВЫ могут определить его в отдельной вытяжке XML , а затем просто установить изображение в ImageView, или вы можете настроить LayerDrawableдинамически в коде. Тем не менее , как вы хотите , чтобы это произошло динамически вам потребуется программный подход , упомянутых ниже.

Программное с использованием коды

Вам необходимо конвертировать ваши Bitmap(которые вы должны были получить после захвата изображения) в Drawable.FOR , которые используют , 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.your Захваченное изображение и 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");

Теперь, делая как выше ваше изображение будет добавлено к концу gallery.If вы хотите хранить в начале галереи, передать этот код .

И если вы хотите оригинальный образ , который был сохранен в галерее только после того, как вы щелкнули фотографию, чтобы быть удалены из галереи, вы можете передать этот SO вопрос .В этот вопрос вы увидите что - то вроде file.getPath(), что нет ничего , кроме пути требуемое изображение , чтобы быть deleted.So , если вы хотите , чтобы получить путь захваченного изображения, смотрите этот вопрос SO .Hopefully теперь у вас есть все идеи с вами , чтобы достичь того, чего вы точно хотите.

Примечание: В случае , если вы хотите знать , как использовать с LayerDrawableпомощью XML

Использование XML

Создайте новый файл 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));
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:"));
    }

Не забудьте объявить ImageView в OnCreate метод тоже следующим образом:

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

Надеюсь это поможет :)