Android将Bitmap缩放到指定大小,并可兼容特殊机型,如三星、一加手机等
一、原始需求
1.将两张图片(Bitmap)进行融合叠加,得到一个半透明的蒙版覆盖再图片上,而被叠加的图片必须和蒙版大小一样。其实这需求是比较简单的,有很多方法都可以实现。之所以写一写是因为这里面有机型兼容的坑。
而且网上几乎没有提到过这个坑。ps:可能机型太少没测试到。
二、使用到的工具
1.不成熟的方案:ps:不能兼容特殊机型,如一加手机,三星手机等。这个中方案不管是在小米、华为、oppo、vivo上都没有多大的毛病,但是如上的两种特殊的机型不行(或许还有其他的不过测试部没那么多测试机)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static Bitmap zoomImg(Bitmap bm, int newWidth , int newHeight){ // 获得图片的宽高 int width = bm.getWidth(); int height = bm.getHeight(); // 计算缩放比例 float scaleWidth = 1.0f*newWidth / width; float scaleHeight = 1.0f*newHeight / height; // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true ); // Bitmap newbm = Bitmap.createScaledBitmap(bm,newWidth,newHeight,true); return newbm; } |
2.相对成熟的方案:ps:可兼容绝大多数的机型,包括一些特殊的机型,如一加手机、三星手机。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private static Bitmap zoomImg2(Bitmap bm, int targetWidth, int targetHeight) { int srcWidth = bm.getWidth(); int srcHeight = bm.getHeight(); float widthScale = targetWidth * 1.0f / srcWidth; float heightScale = targetHeight * 1.0f / srcHeight; Matrix matrix = new Matrix(); matrix.postScale(widthScale, heightScale, 0, 0); // 如需要可自行设置 Bitmap.Config.RGB_8888 等等 Bitmap bmpRet = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bmpRet); Paint paint = new Paint(); canvas.drawBitmap(bm, matrix, paint); return bmpRet; } |
三、总结
强烈建议用第二种方案,因为第二种方案是最稳健的,所有的东西都需要自行实现,其Api可以兼容到4.x的版本,非常稳定。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)