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中矩阵旋转后的拉伸位图的主要内容,如果未能解决你的问题,请参考以下文章