Android 解决小米手机添加图片水印后显示黑边的问题

语言: CN / TW / HK

背景

  • 由于选择图片后需要需要在图片上添加logo,经纬度坐标,天气、时间等内容(图片水印)

  • 测试反馈在小米手机上选择图片上传后有图片在右边和下边有一条黑边 具体查看下图

    小米黑边图

  • 调用代码如下使用O、V、H、及荣耀手机验证,并没有这个现象,应该是小米魔改系统锅了

/**   * 绘制水印图片   *   * @param src         原图   * @param watermark   水印图片   * @param paddingLeft 水印图片 向左距离   * @param paddingTop 水印图片 向上距离   * @return 添加水印后的图片   */  private static Bitmap createWaterMaskBitmap(Bitmap src,                                              Bitmap watermark,                                              int paddingLeft,                                              int paddingTop) {      if (src == null) {          return null;     }   //位图的宽度      int width = src.getWidth();   //位图的高度      int height = src.getHeight();      //创建一个新的和SRC长度宽度一样的位图      Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);      //将该图片作为画布      Canvas canvas = new Canvas(newBitmap);      //在画布 0,0坐标上开始绘制原始图片      canvas.drawBitmap(src, 0, 0, null);      //在画布上绘制水印图片      canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);      // 保存      canvas.save();      // 存储      canvas.restore();      return newBitmap;  }

  • 虽然是小米的锅,但是问题还是要解决的,不然就是多个bug少块钱了😭,这个黑边的宽度看着有点像StatusBarHeight,

  • 那就把图片中的黑边给减掉,然后用Bitmap的宽度减去statusBar高度,上传保存之后和原图做比较,发现宽高都被多裁切了尺寸

    LogUtils.iTag("状态栏和,导航栏高度->",BarUtils.getStatusBarHeight(),","+BarUtils.getNavBarHeight());  if (RomUtils.isXiaomi()) {      //LogUtils.iTag("状态栏和,导航栏高度->",BarUtils.getStatusBarHeight(),","+BarUtils.getNavBarHeight());      width = width - BarUtils.getStatusBarHeight();      height = height - BarUtils.getStatusBarHeight();  }

不尽如意解决方案 ,总归是解决了,不是遗留bug😁

遗憾的是没有找到获取这个黑边宽度和高度的方法

/**       * 绘制水印图片       *       * @param src         原图       * @param watermark   水印图片       * @param paddingLeft 水印图片 向左距离       * @param paddingTop 水印图片 向上距离       * @return 添加水印后的图片       */      private static Bitmap createWaterMaskBitmap(Bitmap src,                                                  Bitmap watermark,                                                  int paddingLeft,                                                  int paddingTop) {          if (src == null) {              return null;         }          int width = src.getWidth();          int height = src.getHeight();  ​          //解决小米手机绘制有黑边的问题          if (RomUtils.isXiaomi()) {              //LogUtils.iTag("状态栏和,导航栏高度->",BarUtils.getStatusBarHeight(),","+BarUtils.getNavBarHeight());              width = width - 25;              height = height - 30;         }  ​          //创建一个新的和SRC长度宽度一样的位图          Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);          //将该图片作为画布          Canvas canvas = new Canvas(newBitmap);          //在画布 0,0坐标上开始绘制原始图片          canvas.drawBitmap(src, 0, 0, null);          //在画布上绘制水印图片          canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);          // 保存          canvas.save();          // 存储          canvas.restore();          return newBitmap;     }  ​

修复后的图片

已修复图片


\