然后是 MainActivity 类的代码,就是获取三个 SeekBar 的值。
public class MainActivity extends AppCompatActivity implements SeekBar。OnSeekBarChangeListener { ImageView iv_photo; float mHue = 0。0f; float mSaturation = 1f; float mLum = 1f; float MID_VALUE; Bitmap oriBitmap,newBitmap; @Override protected void onCreate(Bundle savedInstanceState) { super。onCreate(savedInstanceState); setContentView(R。layout。activity_main); iv_photo = (ImageView) findViewById(R。id。iv_photo); SeekBar barHue = (SeekBar) findViewById(R。id。seekbarHue); SeekBar barSaturation = (SeekBar) findViewById(R。
id。seekbarSaturation); SeekBar barLum = (SeekBar) findViewById(R。id。seekbarLum); MID_VALUE = barHue。getMax() * 1。0F / 2; oriBitmap = BitmapFactory。decodeResource(getResources(), R。drawable。iv_model0); //Android系统不允许直接修改原图 newBitmap = Bitmap。createBitmap(oriBitmap。getWidth(), oriBitmap。getHeight(), Bitmap。Config。ARGB_8888); barHue。setOnSeekBarChangeListener(this); barSaturation。setOnSeekBarChangeListener(this); barLum。setOnSeekBarChangeListener(this); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { switch (seekBar。
getId()) { case R。id。seekbarHue: mHue = (progress - MID_VALUE) * 1。0F / MID_VALUE * 180; break; case R。id。seekbarSaturation: mSaturation = progress * 1。0F / MID_VALUE; break; case R。id。seekbarLum: mLum = progress * 1。0F / MID_VALUE; break; } iv_photo。setImageBitmap(ImageHelper。handleImageEffect(oriBitmap,newBitmap, mHue, mSaturation, mLum)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { }}
代码Demo
其实讲到这里,大家对颜色矩阵和滤镜的实现原理有一个大概的了解了吧。
常用颜色矩阵灰度效果

图像反转

效果如下:

怀旧效果

效果如下:

去色效果

效果如下:

高饱和度

效果如下:

色彩反色
这里是红绿反色,另外红蓝、蓝绿反色原理一样,就是把颜色初始矩阵中对应颜色通道的值交换处理,如下:

GPUImage滤镜
GPUImage是一个专门做滤镜和帖纸的开源库,详细资料就不介绍了,给大家提供一个我开源的使用例子。

项目源码:https://github.com/xiangzhihong/gpuImage
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-84905-8.html
还需要体制的不断改变
打就打
另一方面要通过实际行动向美国表达坚决的意志