【问题标题】:Rotating a bitmap using matrix使用矩阵旋转位图
【发布时间】:2010-08-09 13:56:33
【问题描述】:

使用矩阵旋转位图时,顶点不稳定..

  Matrix matrix = new Matrix();
    matrix.postRotate(mDegree,100,100);
    mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(), mCompPic.getHeight(), matrix, true);
    mCompassHud.setImageBitmap(mCompasstemp);

我的代码的输出就像 -位图将旋转。 -我的位图顶点不稳定。 -Bitmap 正在调整大小

我需要禁用图像调整大小并使旋转稳定。您能提出解决方案吗?

【问题讨论】:

    标签: android matrix bitmap rotation


    【解决方案1】:

    不是直接从原始位图创建新位图,另一个(更直接,恕我直言)选项是创建结果位图,使用该位图创建画布,然后在画布上进行旋转/平移/缩放,然后通过 Canvas 将原始位图绘制到新位图上。

    基本上,您正在寻找:

      scaledImage = Bitmap.createBitmap (croppedWidth, croppedHeight, Bitmap.Config.ARGB_8888);
    
      Canvas offscreenCanvas = new Canvas (scaledImage);
      Matrix matrix = new Matrix();
      matrix.setRotate (rotations, centreX, centreY);
      matrix.postScale(scaleX, scaleY);
      offscreenCanvas.setMatrix (matrix);
    
      offscreenCanvas.drawBitmap (pickedImage, 0, 0, new Paint(Paint.DITHER_FLAG));
    

    【讨论】:

      【解决方案2】:

      不确定这是否是您正在寻找的,但它可能会有所帮助。

      Android 使用其内置的兼容性功能为具有不同像素密度的屏幕适当地缩放和渲染位图。有两种缩放方法,预缩放和自动缩放。

      它会从资源中预缩放位图,并在内部绘制位图时自动缩放(这就是您使用 createBitmap 所做的事情)。

      转到http://developer.android.com/guide/practices/screens_support.html 并检查: 4.使用密度和/或尺寸特定的资源: 位图和九个补丁的预缩放和自动缩放

      【讨论】:

        【解决方案3】:

        我试过这段代码,旋转在位图的中心是稳定的

        matrix.reset();
        matrix.setRotate(degree, Xpos+bitmap.getWidth()/2, Ypos+bitmap.getHeight()/2);
        

        然后在画布中 doDraw()

        canvas.setMatrix(matrix);               
        canvas.drawBitmap(bitmap, Xpos, Ypos, null);
        canvas.setMatrix(null);
        

        Xpos 和 Ypos 是位图的 X 和 Y 位置 setMatrix(null),设置矩阵为null,这样旋转不影响后位图 而且它并不总是创建新的位图,因此对性能非常有用 希望对你有帮助

        【讨论】:

          【解决方案4】:

          我知道这是一个老问题,但是,所有的代码答案都暗示了一个画布,所以这里有一个对我有用的没有画布的解决方案:

          Matrix matrix = new Matrix();
          matrix.postRotate(mDegree,100,100);
          mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(),
              mCompPic.getHeight(), matrix, true);
          
          mCompasstemp = Bitmap.createScaledBitmap(mCompassTemp, mCompPic.getWidth(),
              mCompic.getHeight(), false);
          
          mCompassHud.setImageBitmap(mCompasstemp);
          

          因此,基本上在旋转位图后,您可以将其重新缩放到所需的大小。可能不是最佳实践,但至少如果您不想/不需要创建额外的画布,因为涉及的 Paint() 对象也不是一个廉价的操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-31
            • 1970-01-01
            • 2014-01-13
            • 2022-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多