合并两个位图android

时间:2015-10-23 14:50:06

标签: android bitmap

我使用此代码缩放和更改imageview的位置。一个图像视图是稳定的,一个是通过触摸进行缩放和移动。我想合并它们但是当两个图像合并时,第一个图像位于她的第一个位置,第一个尺寸在缩放之前。如何将它们与新的大小和位置合并?

 //and below is the brightIt func
 public static ColorMatrixColorFilter brightIt(int fb) {
 ColorMatrix cmB = new ColorMatrix();
 cmB.set(new float[] { 
  1, 0, 0, 0, fb,
  0, 1, 0, 0, fb,
  0, 0, 1, 0, fb,
  0, 0, 0, 1, 0   });

 ColorMatrix colorMatrix = new ColorMatrix();
 colorMatrix.set(cmB);
//Canvas c = new Canvas(b2);
//Paint paint = new Paint();
ColorMatrixColorFilter f = new ColorMatrixColorFilter(colorMatrix);
//paint.setColorFilter(f);   
return f;
 }







  public boolean onTouch(View v, MotionEvent event) {
  // handle touch events here
  ImageView view = (ImageView) v;
  switch (event.getAction() & MotionEvent.ACTION_MASK) {
      case MotionEvent.ACTION_DOWN:
          savedMatrix.set(matrix);
          start.set(event.getX(), event.getY());
          mode = DRAG;
          lastEvent = null;
          break;
      case MotionEvent.ACTION_POINTER_DOWN:
          oldDist = spacing(event);
          if (oldDist > 10f) {
              savedMatrix.set(matrix);
              midPoint(mid, event);
              mode = ZOOM;
          }
          lastEvent = new float[4];
          lastEvent[0] = event.getX(0);
          lastEvent[1] = event.getX(1);
          lastEvent[2] = event.getY(0);
          lastEvent[3] = event.getY(1);
          d = rotation(event);
          break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_POINTER_UP:
          mode = NONE;
          lastEvent = null;
          break;
      case MotionEvent.ACTION_MOVE:
          if (mode == DRAG) {
              matrix.set(savedMatrix);
              float dx = event.getX() - start.x;
              float dy = event.getY() - start.y;
              matrix.postTranslate(dx, dy);
          } else if (mode == ZOOM) {
              float newDist = spacing(event);
              if (newDist > 10f) {
                  matrix.set(savedMatrix);
                  float scale = (newDist / oldDist);
                  matrix.postScale(scale, scale, mid.x, mid.y);
              }
              if (lastEvent != null && event.getPointerCount() == 2) {
                  newRot = rotation(event);
                  float r = newRot - d;
                  float[] values = new float[9];
                  matrix.getValues(values);
                  float tx = values[2];
                  float ty = values[5];
                  float sx = values[0];
                  float xc = (view.getWidth() / 2) * sx;
                  float yc = (view.getHeight() / 2) * sx;
                  matrix.postRotate(r, tx + xc, ty + yc);
              }
          }
          break;
  }

  view.setImageMatrix(matrix);
  return true;
 }

 /**
  * Determine the space between the first two fingers
  */
 private float spacing(MotionEvent event) {
  float x = event.getX(0) - event.getX(1);
  float y = event.getY(0) - event.getY(1);
    return FloatMath.sqrt(x * x + y * y);
}

 /**
 * Calculate the mid point of the first two fingers
 */
  private void midPoint(PointF point, MotionEvent event) {
  float x = event.getX(0) + event.getX(1);
  float y = event.getY(0) + event.getY(1);
  point.set(x / 2, y / 2);
  }

    /**
      * Calculate the degree to be rotated by.
   *
     * @param event
    * @return Degrees
     */
 private float rotation(MotionEvent event) {
  double delta_x = (event.getX(0) - event.getX(1));
  double delta_y = (event.getY(0) - event.getY(1));
  double radians = Math.atan2(delta_y, delta_x);
  return (float) Math.toDegrees(radians);
  }

1 个答案:

答案 0 :(得分:0)

我找到了答案: 我在mergeBitmaps类中使用了ontouch类的矩阵。 background是一个可以拖动,缩放和旋转的imageview。所以在线:

            canvas.drawBitmap(stickerBitmap, matrix, null);

我使用ontouch矩阵将位图设置在正确的位置。 在imageview上这里是稳定的,只有背景可以拖动......

  public Bitmap mergeBitmaps() {
    Bitmap baseBitmap = ((BitmapDrawable) on.getDrawable()).getBitmap();

    Bitmap mergedBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), baseBitmap.getConfig());
    Canvas canvas = new Canvas(mergedBitmap);
    canvas.drawBitmap(baseBitmap, new Matrix(), null);



        Bitmap stickerBitmap = ((BitmapDrawable) background.getDrawable()).getBitmap();
        canvas.drawBitmap(stickerBitmap, matrix, null);
        canvas.drawBitmap(baseBitmap, new Matrix(), null);


    return mergedBitmap;
}