Android中矩阵旋转后的拉伸位图

Posted

技术标签:

【中文标题】Android中矩阵旋转后的拉伸位图【英文标题】:Stretched bitmap after matrix rotation in Android 【发布时间】:2016-05-18 09:53:50 【问题描述】:

我正在尝试旋转 JPEG 数据数组,将其转换为位图并旋转矩阵。它工作正常,但是当我尝试旋转 16:9 图像时出现了我的问题(我认为它也会发生 4:3,但我可以很好地欣赏它)。因为矩阵旋转图像但不调整大小,所以我的位图看起来被拉伸到宽度或高度,具体取决于我使用 dataArray 发送的方向。

  protected Bitmap doInBackground(Void... params) 

        // Decode image in background.

        Bitmap bitmap = CameraUtil.downSample(mData, mDownSampleFactor);
        Matrix m = new Matrix();
        Log.i(TAG, "Bitmap=" + bitmap.getWidth() + "x" + bitmap.getHeight());
        if ((mOrientation != 0 || mMirror) && (bitmap != null))               

            if (mMirror) 

            m.setScale(1f, -1f);
        

            m.postRotate(mOrientation);
            return Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),m,false);
        

        return bitmap;

    

 public static Bitmap downSample(final byte[] data, int downSampleFactor) 
        final BitmapFactory.Options opts = new BitmapFactory.Options();
        // Downsample the image
        opts.inSampleSize = downSampleFactor;

    return  BitmapFactory.decodeByteArray(data, 0, data.length, opts);

我已经尝试手动调整图像大小,还将数组转换为 NV21 图像并旋转数组以稍后将其转换为位图并发送。但它给我带来了问题(如此缓慢,有时它看起来完全是绿色和粉红色(彩虹!))。我也尝试使用 Pre、Set 和 PostRotate,但在我所做的测试之间并没有什么不同。

【问题讨论】:

【参考方案1】:

我已经找到了修复它的方法。这是crop方法内部的一个问题,它使用静态措施来创建BitMap,我根据纵横比将方法更改为addapt。

 if (bmp.getWidth() != radius || bmp.getHeight() != radius) 
            //Depending of the Height and Width we get the Aspect Ratio to scale the image before crop it
            if (bmp.getHeight() > bmp.getWidth()) 
                mAspectRatio = (float) bmp.getHeight() / (float) bmp.getWidth();
                sbmp = Bitmap.createScaledBitmap(bmp, radius, (int) (radius * mAspectRatio), false);
             else 
                mAspectRatio = (float) bmp.getWidth() / (float) bmp.getHeight();
                sbmp = Bitmap.createScaledBitmap(bmp, (int) (radius * mAspectRatio), radius, false);

            
        
     else 
        sbmp = bmp;
    
    //output Bitmap will have the final Scale of the Thumbnail, which will be radius x radius
    Bitmap output = Bitmap.createBitmap(radius,radius, Config.ARGB_8888);
    Canvas canvas = new Canvas(output);
//.....Draw canvas, etc etc

【讨论】:

以上是关于Android中矩阵旋转后的拉伸位图的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中使用 Matrix 缩放和旋转位图

从相机/图库加载图像位图时会旋转 [Android 9]

Android:从图库加载的位图在 ImageView 中旋转

如何在Android中旋转位图,使图像中心平滑,无振荡运动

Android,围绕自我中心旋转位图而不缩放它

Android获取相机位图的方向?并向后旋转-90度