合并一个图像覆盖另一个图像

时间:2014-01-01 07:14:32

标签: android android-imageview android-canvas android-bitmap

我有两个图像,图像A是背面的大背景,图像B是一个小图标,将合并在图像A的顶部。

工作原理

用户从相机拍摄照片,这张照片将是图片A. 用户从布局中选择图标,即图像B. 在为图像B选择图像之后,用户可以在布局周围移动图像B,以调整图像B将叠加在图像A顶部的位置。

在用户按下保存之后,画布将合并两个图像,B在A顶部,与用户想要的位置合并,并将其保存到SD卡。

问题

我设法让图片B在布局周围移动但是我不知道如何将它合并到图像A的位置。

这就是我让图像B在布局中移动的方法。

img_additionalImage = (ImageView) findViewById(R.id.img_additionalImage);
    img_additionalImage.setOnTouchListener(new OnTouchListener()
    {
        @SuppressLint("NewApi")
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    isImageMoving = true;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (isImageMoving)
                    {
                        x = event.getRawX() - img_additionalImage.getWidth() / 2;
                        y = event.getRawY() - img_additionalImage.getHeight() / 2;
                        img_additionalImage.setX(x);
                        img_additionalImage.setY(y);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    isImageMoving = false;
                    break;
            }
            return true;
        }
    });

我不知道如何将两张图片合并到用户选择的位置。

1 个答案:

答案 0 :(得分:3)

如果您使用RealtiveLayout或LinearLayout作为此2 imageview的父布局,则可以通过这种方式捕获该视图。

view.setDrawingCacheEnabled(true);
Bitmap b = view.getDrawingCache();
b.compress(CompressFormat.JPEG, 95, new FileOutputStream("/some/location/image.jpg"));

视图是您的视图。 95是JPG压缩的质量。文件输出流就是那个。

setDrawaingCacheEnabled是什么?

  

启用或禁用绘图缓存。当绘图缓存是   启用,下一次调用getDrawingCache()或buildDrawingCache()   将在位图中绘制视图。调用draw(android.graphics.Canvas)   启用缓存时,不会从缓存中提取。受益   从缓存中,您必须通过调用请求绘图缓存   getDrawingCache()如果返回的位图不是,则在屏幕上绘制它   空。

     

启用绘图缓存类似于在硬件上设置图层   加速关闭。打开硬件加速时,   启用绘图缓存对渲染没有影响,因为   系统使用不同的加速机制忽略了   旗。如果要对视图使用位图,即使是硬件也是如此   加速已启用,请参阅setLayerType(int,android.graphics.Paint)   有关如何启用软件和硬件层的信息。

来自Android Docs