在图像移动/调整大小/旋转操作中在图像周围放置一些指示符

Posted

技术标签:

【中文标题】在图像移动/调整大小/旋转操作中在图像周围放置一些指示符【英文标题】:Putting some indicator around the image in image move/resize/rotate operations 【发布时间】:2013-01-25 20:09:57 【问题描述】:

我想缩放、移动、调整图像大小。我想用指示器包围图像,以指导用户这些指示器执行什么操作,即移动、旋转、缩放。

我试过了

缩放 - 但它只会缩小。没有机会增加图片的长度和高度。 旋转 - 通过插入手动角度来实现。这不是一个好的选择。 移动 - 因为我正在实现 Api

是否有任何库可以让我进行简单的图像编辑[移动、缩放、旋转]?

【问题讨论】:

@Pragnani Nah 还没有。增加图像的大小让我很烦恼,因为我们不能在现场添加比实际图像大小更大的大小matrix.postScale() 【参考方案1】:

您可以使用矩阵变换来实现旋转、缩放和移动....希望对您有所帮助....

旋转

Matrix matrix = new Matrix();
    matrix.postRotate(90);

用于缩放

 matrix.postScale(scaleWidth, scaleHeight);

创建新的位图而不改变原来的...像这样

Bitmap bmp2 = Bitmap.createBitmap(bmp1, 0, 0, pow2, pow2, matrix, true);

【讨论】:

是的,我当然可以使用矩阵变换。我已经尝试通过添加矩阵进行旋转。但我需要的是从指标输入到矩阵。任何从指标获取输入到矩阵的帮助都将受到欢迎。 @VikalpPatel 当您设置 onTouchListener 时,您将获得图像的 x 和 y 坐标...基于您可以缩放、旋转和移动的移动 是的,但是在matrix.postScale() 中,我们不能添加超过图像实际尺寸的尺寸。这就是困扰我的问题。【参考方案2】:

使用库:StickerView

它是一个第 3 方库,它提供了我正在寻找的东西。

解决方法:

这些答案仍然是我在 OP 中要求的一半。表示它没有被某些特定指标包围。我仍在寻找如何用指标包装ImageView 并将它们用于翻译和调整大小。

Activity 内部变量的初始化对于翻译和调整 ImageView 很重要

public static final int DRAG = 1;
public static final int NONE = 0;
private static final String TAG = "Touch";
public static final int ZOOM = 2;
public static PointF mid = new PointF();
public static int mode = 0;
float d = 0.0F;
Matrix savedMatrix = new Matrix();
Matrix matrix = new Matrix();
PointF start = new PointF();

ImageView 设置为 scaleType - Matrix

iv = new ImageView(this);
iv.setPadding(10, 10, 25, 25);
iv.setScaleType(ImageView.ScaleType.MATRIX);

iv.setOnTouchListener(t);

将 onTouch 监听器添加到 ImageView 使用

1 指翻译 - 拖动

2 指缩放 - 调整大小 Pinch To Zoom

View.OnTouchListener t = new View.OnTouchListener()

public boolean onTouch(View paramView, MotionEvent event)

  ImageView view = (ImageView)paramView;
  switch (event.getAction() & MotionEvent.ACTION_MASK)
  
  case MotionEvent.ACTION_DOWN:

      savedMatrix.set(matrix);
      start.set(event.getX(), event.getY());
      Log.d(TAG, "mode=DRAG" );
      mode = DRAG;
      break;
  case MotionEvent.ACTION_POINTER_DOWN:

      oldDist = spacing(event);
      Log.d(TAG, "oldDist=" + oldDist);
      if (oldDist > 10f) 

          savedMatrix.set(matrix);
          midPoint(mid, event);
          mode = ZOOM;
          Log.d(TAG, "mode=ZOOM" );
      
      break;

  case MotionEvent.ACTION_MOVE:

      if (mode == DRAG) 

          matrix.set(savedMatrix);
          matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
      
      else if (mode == ZOOM) 

          float newDist = spacing(event);
          Log.d(TAG, "newDist=" + newDist);
          if (newDist > 10f) 

              matrix.set(savedMatrix);
              float scale = newDist / oldDist;
              matrix.postScale(scale, scale, mid.x, mid.y);
          
      
      break;

  case MotionEvent.ACTION_UP:
  case MotionEvent.ACTION_POINTER_UP:

      mode = NONE;
      Log.d(TAG, "mode=NONE" );
      break;
    
  view.setImageMatrix(matrix);
  return true;



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


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

【讨论】:

【参考方案3】:

只需查看此图像裁剪参考:

http://www.londatiga.net/featured-articles/how-to-select-and-crop-image-on-android/

图片旋转,参考这个例子即可;此示例代码动态表示图像的旋转:

http://android-er.blogspot.in/2010/07/rotate-bitmap-image-using-matrix.html

此链接对于图像裁剪、旋转和缩放也很有用:

https://github.com/Yalantis/uCrop

【讨论】:

第一个链接使用crop intent 特定于AOSP camera app,并非所有设备都存在,因此使用该方法会崩溃。使用像 github.com/lvillani/android-cropimage 这样的库,它涵盖了所有内容。【参考方案4】:

我最近尝试了同样的事情,但最终使用了一个库,因为它涵盖了更多的边缘情况。这是一个很棒且使用非常广泛的库:

http://code.google.com/p/android-multitouch-controller/

【讨论】:

【参考方案5】:

我想我可以在轮换部分为您提供帮助。我最近制作了一个 android 轮菜单库。它跟踪用户的手部动作并相应地旋转图像视图。您可以在此处查看源代码以了解我是如何做到的:

https://github.com/anupcowkur/Android-Wheel-Menu

【讨论】:

感谢兄弟的轮换库。我会尽快检查的!! 这个库很好。但是当我在java文件中创建一个图像视图并使用这个库来旋转图像时,我看不到旋转。你能帮我解决这个问题吗? @G_S 如果一切都按照提供的说明进行设置,那么它应该可以完美运行,没有任何问题。 我创建了一个对象并将其与我的图像视图相关联。但我无法旋转它。我能知道说明在哪里吗 这是我尝试过的,但我无法旋转图像 LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout); ImageView wheel_image = new ImageView(this); wheel_image.setImageResource(R.drawable.wheel); final WheelMenu wm = new WheelMenu(MainActivity.this, 12, R.drawable.wheel, wheel_image, true); layout.addView(wheel_image);【参考方案6】:

我知道这不是答案,但值得一提。

看看this project。我打算把它放在 GitHub 上,但它还没有完成(根本)。

有一个按钮可以旋转图像。我仍在努力“保存”。感谢Lorenzo Villani's project

,许多类都取自 Android 源代码

添加到您的项目清单中:

    <activity
        android:name="mobi.sherif.camera.CropImage"
        android:hardwareAccelerated="false"
        android:screenOrientation="portrait" >

使用以下方式调用活动:

Intent intent = new Intent(mContext, CropImage.class);
intent.setData(uri);
startActivityForResult(intent, S.request.cropimage);

【讨论】:

感谢您的建议。我会看看你的 github 存储库。 @VikalpPatel 我发布了 ZIP 文件。它正在旋转,但正在保存文件。我还在慢慢研究它。 那么你能在同一个 Activity 上实现“旋转”和“裁剪”吗? @Darpan 我真的不记得了。试试这个项目。对不起):【参考方案7】:

位图旋转

Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config);
Canvas canvas = new Canvas(targetBitmap);
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
canvas.drawBitmap(source, matrix, new Paint());

图像缩放 Scaling

AssetManager assetManager = context.getAssets();
InputStream imageIn;
String imgPath = "test.png";
Bitmap image;
try 
    imageIn = assetManager.open(imgPath, AssetManager.ACCESS_BUFFER);
    image = BitmapFactory.decodeStream(imageIn);
 catch (IOException e) 


//TODO: calculate width and height to fill or fit screen
image = Bitmap.createScaledBitmap(image, width, height, true);

图像移动 Image in Canvas with touch events

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;

public class ImgView extends View 

private static final int INVALID_POINTER_ID = -1;

    private Drawable mImage;
    private float mPosX;
    private float mPosY;

    private float mLastTouchX;
    private float mLastTouchY;
    private int mActivePointerId = INVALID_POINTER_ID;

    private ScaleGestureDetector mScaleDetector;
    private float mScaleFactor = 1.f;

    public ImgView(Context context) 
        this(context, null, 0);
    mImage = getResources().getDrawable(R.drawable.imagename);

        mImage.setBounds(0, 0, mImage.getIntrinsicWidth(), mImage.getIntrinsicHeight());
    

    public ImgView(Context context, AttributeSet attrs) 
        this(context, attrs, 0);
    

    public ImgView(Context context, AttributeSet attrs, int defStyle) 
        super(context, attrs, defStyle);
        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    

    @Override
    public boolean onTouchEvent(MotionEvent ev) 
        // Let the ScaleGestureDetector inspect all events.
        mScaleDetector.onTouchEvent(ev);

        final int action = ev.getAction();
        switch (action & MotionEvent.ACTION_MASK) 
        case MotionEvent.ACTION_DOWN: 
            final float x = ev.getX();
            final float y = ev.getY();

            mLastTouchX = x;
            mLastTouchY = y;
            mActivePointerId = ev.getPointerId(0);
            break;
        

        case MotionEvent.ACTION_MOVE: 
            final int pointerIndex = ev.findPointerIndex(mActivePointerId);
            final float x = ev.getX(pointerIndex);
            final float y = ev.getY(pointerIndex);

            // Only move if the ScaleGestureDetector isn't processing a gesture.
            if (!mScaleDetector.isInProgress()) 
                final float dx = x - mLastTouchX;
                final float dy = y - mLastTouchY;

                mPosX += dx;
                mPosY += dy;

                invalidate();
            

            mLastTouchX = x;
            mLastTouchY = y;

            break;
        

        case MotionEvent.ACTION_UP: 
            mActivePointerId = INVALID_POINTER_ID;
            break;
        

        case MotionEvent.ACTION_CANCEL: 
            mActivePointerId = INVALID_POINTER_ID;
            break;
        

        case MotionEvent.ACTION_POINTER_UP: 
            final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = ev.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId) 
                // This was our active pointer going up. Choose a new
                // active pointer and adjust accordingly.
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = ev.getX(newPointerIndex);
                mLastTouchY = ev.getY(newPointerIndex);
                mActivePointerId = ev.getPointerId(newPointerIndex);
            
            break;
        
        

        return true;
    

    @Override
    public void onDraw(Canvas canvas) 
        super.onDraw(canvas);

        canvas.save();
        Log.d("DEBUG", "X: "+mPosX+" Y: "+mPosY);
        canvas.translate(mPosX, mPosY);
        canvas.scale(mScaleFactor, mScaleFactor);
        mImage.draw(canvas);
        canvas.restore();
    

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener 
        @Override
        public boolean onScale(ScaleGestureDetector detector) 
            mScaleFactor *= detector.getScaleFactor();

            // Don't let the object get too small or too large.
            mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));

            invalidate();
            return true;
        
    


【讨论】:

【参考方案8】:

你可以https://github.com/siddhpuraamitr/MultitouchWithDynamicAddandRemove在你的项目中试试这段代码

【讨论】:

这是一个很棒的存储库!如果它有更好的文档就好了。

以上是关于在图像移动/调整大小/旋转操作中在图像周围放置一些指示符的主要内容,如果未能解决你的问题,请参考以下文章

iPhone iOS:如何在图像背景上动态移动/调整图像大小?

XCode:调整图像大小使用纵横比并向下移动图像下方的元素

如何在 java 中创建一些东西来根据纵横比调整图像的大小和位置? [关闭]

旋转和调整图像大小 + iPhone

使用 node sharp 包调整图像大小并上传到 s3 时,它会旋转

调整大小时夏普图像库旋转图像?