Android开发实现去除bitmap无用白色边框的方法示例

所属分类: 软件编程 / Android 阅读数: 43
收藏 0 赞 0 分享

本文实例讲述了Android开发实现去除bitmap无用白色边框的方法。分享给大家供大家参考,具体如下:

图示

如下图所示,之前介绍过Android Bitmap的用法,这里提供的工具类作用是,去除内容区域以外的白色边框。

代码

import android.graphics.Bitmap;
/**
 * Created by Victor Yang on 2016/6/17.
 * 去除 bitmap 无用的白色边框
 */
public class BitmapDeleteNoUseSpaceUtil {
  /**
   * 灰度化 bitmap
   * @param imgTheWidth
   * @param imgTheHeight
   * @param imgThePixels
   * @return
   */
  private static Bitmap getGrayImg(int imgTheWidth, int imgTheHeight, int[] imgThePixels) {
    int alpha = 0xFF << 24; //设置透明度
    for (int i = 0; i < imgTheHeight; i++) {
      for (int j = 0; j < imgTheWidth; j++) {
        int grey = imgThePixels[imgTheWidth * i + j];
        int red = ((grey & 0x00FF0000) >> 16); //获取红色灰度值
        int green = ((grey & 0x0000FF00) >> 8); //获取绿色灰度值
        int blue = (grey & 0x000000FF);     //获取蓝色灰度值
        grey = (int) ((float) red * 0.3 + (float) green * 0.59 + (float) blue * 0.11);
        grey = alpha | (grey << 16) | (grey << 8) | grey; //添加透明度
        imgThePixels[imgTheWidth * i + j] = grey;  //更改像素色值
      }
    }
    Bitmap result =
        Bitmap.createBitmap(imgTheWidth, imgTheHeight, Bitmap.Config.RGB_565);
    result.setPixels(imgThePixels, 0, imgTheWidth, 0, 0, imgTheWidth, imgTheHeight);
    return result;
  }
  /**
   * 去除多余白框
   * @param originBitmap
   * @return
   */
  public static Bitmap deleteNoUseWhiteSpace(Bitmap originBitmap) {
    int[] imgThePixels = new int[originBitmap.getWidth() * originBitmap.getHeight()];
    originBitmap.getPixels(
        imgThePixels,
        0,
        originBitmap.getWidth(),
        0,
        0,
        originBitmap.getWidth(),
        originBitmap.getHeight());
    // 灰度化 bitmap
    Bitmap bitmap = getGrayImg(
        originBitmap.getWidth(),
        originBitmap.getHeight(),
        imgThePixels);
    int top = 0; // 上边框白色高度
    int left = 0; // 左边框白色高度
    int right = 0; // 右边框白色高度
    int bottom = 0; // 底边框白色高度
    for (int h = 0; h < bitmap.getHeight(); h++) {
      boolean holdBlackPix = false;
      for (int w = 0; w < bitmap.getWidth(); w++) {
        if (bitmap.getPixel(w, h) != -1) { // -1 是白色
          holdBlackPix = true; // 如果不是-1 则是其他颜色
          break;
        }
      }
      if (holdBlackPix) {
        break;
      }
      top++;
    }
    for (int w = 0; w < bitmap.getWidth(); w++) {
      boolean holdBlackPix = false;
      for (int h = 0; h < bitmap.getHeight(); h++) {
        if (bitmap.getPixel(w, h) != -1) {
          holdBlackPix = true;
          break;
        }
      }
      if (holdBlackPix) {
        break;
      }
      left++;
    }
    for (int w = bitmap.getWidth() - 1; w >= 0; w--) {
      boolean holdBlackPix = false;
      for (int h = 0; h < bitmap.getHeight(); h++) {
        if (bitmap.getPixel(w, h) != -1) {
          holdBlackPix = true;
          break;
        }
      }
      if (holdBlackPix) {
        break;
      }
      right++;
    }
    for (int h = bitmap.getHeight() - 1; h >= 0; h--) {
      boolean holdBlackPix = false;
      for (int w = 0; w < bitmap.getWidth(); w++) {
        if (bitmap.getPixel(w, h) != -1) {
          holdBlackPix = true;
          break;
        }
      }
      if (holdBlackPix) {
        break;
      }
      bottom++;
    }
    // 获取内容区域的宽高
    int cropHeight = bitmap.getHeight() - bottom - top;
    int cropWidth = bitmap.getWidth() - left - right;
    // 获取内容区域的像素点
    int[] newPix = new int[cropWidth * cropHeight];
    int i = 0;
    for (int h = top; h < top + cropHeight; h++) {
      for (int w = left; w < left + cropWidth; w++) {
        newPix[i++] = bitmap.getPixel(w, h);
      }
    }
    // 创建切割后的 bitmap, 针对彩色图,把 newPix 替换为 originBitmap 的 pixs
    return Bitmap.createBitmap(newPix, cropWidth, cropHeight, Bitmap.Config.ARGB_8888);
  }
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android拍照与图片处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

更多精彩内容其他人还在看

Retrofit2日志拦截器的使用

这篇文章主要介绍了Retrofit2日志拦截器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android创建外部lib库及自定义View的图文教程

这篇文章主要给大家介绍了关于Android创建外部lib库及自定义View的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序失败的一些事小结

这篇文章主要给大家介绍了关于Android分享微信小程序失败一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序技巧之图片优化

这篇文章主要给大家介绍了关于Android分享微信小程序技巧之图片优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android Viewpager实现无限循环轮播图

这篇文章主要为大家详细介绍了Android Viewpager实现无限循环轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中的Bitmap序列化失败的解决方法

这篇文章主要介绍了Android中的Bitmap序列化失败的解决方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android自定义通用标题栏CustomTitleBar

这篇文章主要为大家详细介绍了Android自定义通用标题栏CustomTitleBar,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android组合控件自定义标题栏

这篇文章主要为大家详细介绍了Android组合控件自定义标题栏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义复合控件实现通用标题栏

这篇文章主要为大家详细介绍了Android自定义复合控件实现通用标题栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

ExpandableListView实现简单二级列表

这篇文章主要为大家详细介绍了ExpandableListView实现简单二级列表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多