【问题标题】:Android ImageView to Bitmap after rotating旋转后Android ImageView到Bitmap
【发布时间】:2017-08-29 23:39:58
【问题描述】:

我想从 imageView 创建位图,但我首先需要在转换位图之前旋转我的 imageView。我使用以下代码将 imageView 转换为 Bitmap。

 BitmapDrawable drawable = (BitmapDrawable) imgPhoto.getDrawable();
 Bitmap photo = drawable.getBitmap();

imageView 实现了旋转手势。我希望能够旋转 imageView,然后使用旋转后的 imageView 创建位图。但是,似乎我的位图仍在获取原始 imageView 而不是旋转位置。以下是完整的代码。谢谢。

 public class MainActivity extends AppCompatActivity implements RotationGestureDetector.OnRotationGestureListener{

private ImageView imgPhoto, imgBackground, imgCombine;
private RotationGestureDetector mRotationDetector;
private Button btnCombine;
private float angle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRotationDetector = new RotationGestureDetector(this);

    imgPhoto = (ImageView) findViewById(R.id.imgPhoto);
    imgBackground = (ImageView) findViewById(R.id.imgBackground);
    collageImage = (ImageView) findViewById(R.id.imgCombine);

    btnCombine = (Button)findViewById(R.id.btnCombineImage);
    btnCombine.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            BitmapDrawable drawable = (BitmapDrawable) imgPhoto.getDrawable();
            Bitmap photo = drawable.getBitmap();

        }
    });
}

@Override
public boolean onTouchEvent(MotionEvent event){
    mRotationDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}

@Override
public void OnRotation(RotationGestureDetector rotationDetector) {
    angle = rotationDetector.getAngle();
    Log.d("RotationGestureDetector", "Rotation: " + Float.toString(angle));
    imgPhoto.setRotation(imgPhoto.getRotation() + (-angle));
}

 }

【问题讨论】:

    标签: android android-imageview android-bitmap android-gesture


    【解决方案1】:

    要旋转 ImageView:

    Matrix matrix = new Matrix();
    imageView.setScaleType(ImageView.ScaleType.MATRIX);   //required
    matrix.postRotate((float) angle, pivotX, pivotY);
    imageView.setImageMatrix(matrix);
    

    来源:https://stackoverflow.com/a/10104318/7639113

    然后就可以使用DrawingCache创建位图了,

    imageView.setDrawingCacheEnabled(true);
    Bitmap bitmap = imageView.getDrawingCache();
    

    【讨论】:

      【解决方案2】:

      尝试在 onClick 之后使用此代码。它应该提供一个指定角度的旋转位图。

      Matrix matrix = new Matrix();
      matrix.postRotate(angle);
      Bitmap rotatedPhoto = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), matrix, true);
      

      【讨论】:

      • 我得到一个方法无法解决错误。位图rotatedPhoto = Bitmap.createBitmap(imgPhoto, 0, 0, imgPhoto.getWidth(), imgPhoto.getHeight(), matrix, true);
      【解决方案3】:

      旋转效果实际上是在画布级别应用的。因此,您可以做的是获取当前的 Canvas 增强功能,然后将您的位图绘制成带有更改的新位图。

                 Matrix transformMatrix =  imgPhoto.getImageMatrix()
      
                  Bitmap original = photo;
      
                  Bitmap adjusted = Bitmap.createBitmap(original.getWidth(),
                          original.getHeight(),
                          original.getConfig());
                  Canvas canvas = new Canvas(adjusted);
                  canvas.setMatrix(transformMatrix);
                  canvas.drawBitmap(original, 0, 0, null);
      
                  //at this point adjusted bitmap contains the rotated image
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 2015-09-06
        相关资源
        最近更新 更多