Android开发:如何将Assets中Bitmap修改为960x720尺寸?
嘿,这个需求很容易解决!你现在的代码是创建了和原图一样大小的board Bitmap,然后直接把原图按原尺寸画上去,所以要改成目标尺寸的话,只需要调整board的创建尺寸,再让Canvas把原图缩放绘制进去就行。
直接给你修改后的代码,注释里标了关键改动:
InputStream in = null; Bitmap bm = null; try { in = getAssets().open(file); bm = BitmapFactory.decodeStream(in); // 关键改动1:创建960x720尺寸的目标Bitmap Bitmap board = Bitmap.createBitmap(960, 720, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(board); // 关键改动2:缩放绘制原图到整个board区域 // 第一个参数是原图,第二个参数null表示使用整个原图作为源区域 // 第三个参数是目标区域,这里直接填整个board的矩形,Canvas会自动缩放填充 canvas.drawBitmap(bm, null, new Rect(0, 0, 960, 720), null); // 接下来就可以把board转换成OpenCV Mat了 // Mat mat = new Mat(); // Utils.bitmapToMat(board, mat); } catch (IOException e) { e.printStackTrace(); } finally { // 别忘了关闭流和回收临时Bitmap,避免内存泄漏 if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (bm != null && !bm.isRecycled()) { bm.recycle(); } }
另外还有一种用Matrix实现缩放的方式,效果和上面一致,你也可以试试:
// 替代上面的drawBitmap行 Matrix scaleMatrix = new Matrix(); // 计算宽高的缩放比例 float scaleWidth = 960f / bm.getWidth(); float scaleHeight = 720f / bm.getHeight(); scaleMatrix.postScale(scaleWidth, scaleHeight); canvas.drawBitmap(bm, scaleMatrix, null);
这里要提醒你:原图是360x240(比例3:2),目标尺寸是960x720(比例4:3),直接拉伸会导致图片变形。如果需要保持原图比例,同时填满目标区域(超出部分裁剪),可以用下面的逻辑调整绘制区域:
float scaleX = 960f / bm.getWidth(); float scaleY = 720f / bm.getHeight(); // 取较大的缩放比例,保证填满目标区域 float scale = Math.max(scaleX, scaleY); float scaledWidth = bm.getWidth() * scale; float scaledHeight = bm.getHeight() * scale; // 计算居中偏移量 float offsetX = (960 - scaledWidth) / 2; float offsetY = (720 - scaledHeight) / 2; // 绘制时使用计算后的目标矩形 canvas.drawBitmap(bm, null, new RectF(offsetX, offsetY, offsetX + scaledWidth, offsetY + scaledHeight), null);
如果是要完整显示原图(留白),把Math.max换成Math.min即可。
内容的提问来源于stack exchange,提问作者Xwa
相关产品推荐
相关产品推荐

