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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Android截取视频帧并转化为Bitmap示例

    MainActivity如下: 复制代码 代码如下: package cn.testmediametadataretriever; import java.io.File; import java.io.FileOutputStream; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.app.Activity;

  • Android读取本地或网络图片并转换为Bitmap

    在做android项目时,我们经常需要从本地或者网络读取图片,并转换为Bitmap图片,以便使用,下面是读取本地图片并转换的方法: Java代码 /** * 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如: * * A.网络路径: url="http://blog.foreverlove.us/girl2.png" ; * * B.本地路径:url="file://mnt/sdcard/photo/image.png"; * * C.

  • Android canvas drawBitmap方法详解及实例

     Android canvas drawBitmap方法详解及实例 之前自己在自定义view,用到canvas.drawBitmap(Bitmap, SrcRect, DesRect, Paint)的时候,对其中的第2和3个参数的含义含糊不清.看源码函数也没理解,然后看了一些其他的博客加上自己的理解,整理如下.首先,我们看一张图片,今天就要绘制这张图片. 然后将图片用红色的线条分成4个部分,如下: 我们自定义一个View,代码如下: public class PoterDuffLoadingVi

  • Android Activity之间传递图片(Bitmap)的方法

    在Android开发中:Activity之间传递参数是常见的事:如果我们要在Activity之间传递图片:1.MainActivity中包括一个ImageView:当我们点击ImageView时:把图片传递给另外一个Activity MainActivity的主要代码: 复制代码 代码如下: Intent intent=new Intent(MainActivity.this,TranActivity.class);            intent.putExtra("bitmap"

  • 解析Android开发优化之:对Bitmap的内存优化详解

    1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需要这个方法呢? Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap对象,只能通过BitmapFactory类的各种静态方法来实例化一个Bitmap.仔细查看BitmapFactory的源代码可以看到,生成Bitmap对象最终都是通

  • Android实现波浪线效果(xml bitmap)

    我们要实现的效果如下: 在这之前先带大家了解一下xml bitmap,何为XML Bitmap? XML Bitmap 是一个用XML定义的文件放在资源目录,定义的对象是图片,为bitmap定义别名,这个文件可以给bitmap定义一些额外的属性.例如:抖动. 1.文件存放位置 res/drawable/filename.xml 2.语法 <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:and

  • android通过bitmap生成新图片关键性代码

    1.关键性代码 复制代码 代码如下: //R.drawable.test为当前工程里的一张图片 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); FileOutputStream fos = null; try { File file = new File("/mnt/sdcard/testfile"); if (!file.exists()) { file.mkdir(); }

  • android保存Bitmap图片到指定文件夹示例

    复制代码 代码如下: /** 保存方法 */ public void saveBitmap() { Log.e(TAG, "保存图片"); File f = new File("/sdcard/namecard/", picName); if (f.exists()) { f.delete(); } try { FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFor

  • android中Bitmap用法(显示,保存,缩放,旋转)实例分析

    本文实例讲述了android中Bitmap用法.分享给大家供大家参考.具体如下: 在Android SDK中可以支持的图片格式如下:png , jpg , gif和bmp. 1.Bitmap的创建 借助于BitmapFactory. 1)资源中的图片 使用BitmapFactory获取位图 复制代码 代码如下: Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.testImg); 或者是: Reso

  • android中Bitmap的放大和缩小实例代码

    复制代码 代码如下: /**Bitmap放大的方法*/ private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f); //长和宽放大缩小的比例 Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); return

  • Android App开发中将View或Drawable转为Bitmap的方法

    View转换为Bitmap Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片:Coverflow中需要把一页一页的view转换为Bitmap.以便实现复杂的图形效果(阴影.倒影效果等):再比如一些动态的实时View为便于观察和记录数据.需要临时生成静态的Bitmap. 实现方法: 1)下面是笔者经常用的一个转换方法 public static Bitmap convertViewToBitmap(View view, int bitmapWid

  • Android中使用Bitmap类将矩形图片转为圆形的方法

    一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: public static Bitmap makeRoundCorner(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int left = 0, top = 0, right = width, bot

随机推荐