一起学android之给图片去色,返回灰度图片以及ColorMatrix中setSaturation方法的用法(34)

原图:

效果图:

实现以上效果其实很简单,直接上代码:

public class MainActivity extends Activity {
	private Button btn_start;
	private ImageView img;
	private Bitmap bitmap;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.image_layout);
		initView();
	}

	private void initView() {
		img = (ImageView) findViewById(R.id.iv_image);
		btn_start = (Button) findViewById(R.id.btn_start);

		bitmap = ((BitmapDrawable) img.getDrawable()).getBitmap();

		btn_start.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Bitmap bm = ImageTools.toGrayscale(bitmap);
				img.setImageBitmap(bm);
			}
		});

	}
}

看下ImageTools工具类中的方法:

/** */
	/**
	 * 图片去色,返回灰度图片
	 *
	 * @param bmpOriginal
	 *            传入的图片
	 * @return 去色后的图片
	 */
	public static Bitmap toGrayscale(Bitmap bmp) {
		if (bmp != null) {
			int width, height;
			Paint paint = new Paint();
			height = bmp.getHeight();
			width = bmp.getWidth();
			Bitmap bm = Bitmap.createBitmap(width, height,
					Bitmap.Config.RGB_565);
			Canvas c = new Canvas(bm);
			ColorMatrix cm = new ColorMatrix();
			cm.setSaturation(0);
			ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
			paint.setColorFilter(f);
			c.drawBitmap(bmp, 0, 0, paint);
			return bm;
		}else{
			return bmp;
		}
	}

实现去色重点用到了ColorMatrix类中的setSaturation方法,如果去查看官网API的话,这个方法下有这么一段说明:

  • Set the matrix to affect the saturation of colors. A value of 0 maps the color to gray-scale. 1 is identity.

意思是去设置颜色矩阵的饱和度,0是灰色的,1是原图,那这个方法是不是只能设置0或1呢?其实不是,我们看下

setSaturation源码是如何实现的:

 public void setSaturation(float sat) {
        reset();
        float[] m = mArray;

        final float invSat = 1 - sat;
        final float R = 0.213f * invSat;
        final float G = 0.715f * invSat;
        final float B = 0.072f * invSat;

        m[0] = R + sat; m[1] = G;       m[2] = B;
        m[5] = R;       m[6] = G + sat; m[7] = B;
        m[10] = R;      m[11] = G;      m[12] = B + sat;
    }

关于设置图片颜色的原理请参看

一起学android之利用ColorMatrix进行图片的各种特效处理(32)

我们接着看上面的代码,第一步调用了reset方法,我们看下reset方法:

/**
     * Set this colormatrix to identity:
     * [ 1 0 0 0 0   - red vector
     *   0 1 0 0 0   - green vector
     *   0 0 1 0 0   - blue vector
     *   0 0 0 1 0 ] - alpha vector
     */
    public void reset() {
        final float[] a = mArray;

        for (int i = 19; i > 0; --i) {
            a[i] = 0;
        }
        a[0] = a[6] = a[12] = a[18] = 1;
    }

其实就是将颜色矩阵中的值进行初始化。

接着看就会发现,给图片去色,就是改变颜色矩阵中的值。

将setSaturation中的值设成3看看:

public static Bitmap toGrayscale(Bitmap bmp) {
		if (bmp != null) {
			int width, height;
			Paint paint = new Paint();
			height = bmp.getHeight();
			width = bmp.getWidth();
			Bitmap bm = Bitmap.createBitmap(width, height,
					Bitmap.Config.RGB_565);
			Canvas c = new Canvas(bm);
			ColorMatrix cm = new ColorMatrix();
			cm.setSaturation(3);
			ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
			paint.setColorFilter(f);
			c.drawBitmap(bmp, 0, 0, paint);
			return bm;
		}else{
			return bmp;
		}
	}

效果如下:

通过改变颜色矩阵值,可以实现一些比较好看的效果。

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/45244049情绪控_

时间: 2024-07-29 10:16:26

一起学android之给图片去色,返回灰度图片以及ColorMatrix中setSaturation方法的用法(34)的相关文章

c# winform 把彩色图片转换为灰色的图片,变灰,灰度图片,速度很快,safe,unsafe

把彩色图片转换为灰色的图片,直接用.net接口遍历每个像素点转换的效率非常低,800K的图片65万像素我的电脑要用5分钟,而用了unsafe,速度提高了几千倍,同样的图片只用了0.几秒 附一个常用的遍历像素点转换的代码 构造函数 C#代码   public Tphc() { InitializeComponent(); this.pictureBox1.ImageLocation = "F:\\黑色头发.jpg"; } 按钮单击事件 C#代码   private void button

Xcode9学习笔记51 - 将一张普通的图片转换成灰度图片CGColorSpaceCreateDeviceGray

override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let image = UIImage(named: "img01")//从项目资源中读取一张图片 let grayedImage = self.grayImage(image: image!)//调用灰度图转换方法,将图片转换成灰度图 let

识别图片文字转换到Word文档中的方法

识别图片文字转换成Word常常发生在需要编辑图中文字的时候,那又该怎样去进行这一操作呢?下面小编就来为大家讲解下具体的操作流程,有需要的小伙伴们可以参考下. 参考工具:迅捷OCR文字识别软件 操作步骤: 1:首先将所需识别的图片在电脑中准备好,接着下载安装一款支持图片文字识别转换的软件,帮助进行以下的操作. 2:打开迅捷OCR文字识别软件,打开后选择极速识别板块点击添加文件按钮将所需识别的图片添加进来. 3:图片添加进去后,将识别格式更改为DOCX,识别效果设置为识别优先. 4:可以提前软件左下

在Fragment中OnActivityResult方法中接收Activity中返回的值

在Fragment中OnActivityResult方法中接收Activity中返回的值 在Fragment中OnActivityResult方法中接收Activity中返回的值,有需要的朋友可以参考下. 在开发android中,有些人往往很疑惑,当一个FragmentActivity中有多个碎片的时候,如a,b,c三个碎片, 其中b中进行了操作,跳转到了新的界面D(activity).但是当D操作完后,返回值到碎片b.那么问题就来了,肯定会有人问,b是一个碎片,如何才能接收到D传过来的值呢?

Android - LayoutInflater和inflate方法的用法

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如 Button.TextView等). 具体作用: 1.对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入: 2.对于一个已经载入的界面,就可以使用Activiyt

如何利用openCV做灰度图片

将彩色图片变成灰度图片的两种方式: 1.使用openCV 2.使用IOS系统自带的开发库实现 3.实现架构布局(设计模式:策略模式) 第一:使用openCV 1.下载openCV框架:http://opencv.org/ 2.导入项目 3.创建渲染灰度图片类: #import "ImageUtils.h" //第一步导入OpenCV 头文件 #import <opencv2/opencv.hpp> #import <opencv2/imgcodecs/ios.h>

从零开始学android&lt;ImageSwitcher图片切换组件.二十六.&gt;

ImageSwitcher组件的主要功能是完成图片的切换显示,例如用户在进行图片浏览的时候,可以通过按钮点击一张张的切换显示的图片,而且使用ImageSwitcher组件在每次切换的时候也可以为其增加一些动画的效果,此类定义如下: java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.FrameLayout ? android.widget.ViewAnimator ? android.wid

从零开始学android&lt;ListView数据列表显示组件.二十一.&gt;

与滚动视图(ScrollView)类似的还有一种列表组件(ListView),可以将多个组件加入到ListView之中以达到组件的滚动显示效果,ListView组件本身也有对应的ListView类支持,可以通过操作ListView类以完成对此组组件的操作,ListView类的继承结构如下所示: java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.AdapterView<T extends a

处女男学Android(十一)---Gallery、ViewPager和ViewPager+Fragment实现的Tab导航

一.前言 有阵子没更新博客了,主要是最近公司接了个P2P的金融借贷项目没人做,被拉去写服务端,所以迟迟没时间继续学习大安卓,想了想自己的安卓水平和公司的专业安卓璟博比起来依旧差距挺大,于是乎我要加把劲赶上才行,所以继续翻开李刚疯狂讲义系列,看到Gallery这个控件了,大致功能是横向滚动查看列表项,再仔细看了一下居然过时了,官方推荐用ViewPager来替代,还没学就过时了,有点不爽,干脆新的旧的一起学习一下,也好进行一下比较吧.废话不多说,首先是已经过时的Gallery. 二.画廊视图Gall