从等式中可以看出abcde决定红色、fghi决定绿色、klmn决定蓝色、pqrs决定透明色
而ejot就决定了偏移量。
改变颜色
通过上面对色彩矩阵的简单了解,我们可以想到改变图片的颜色方法来给相片进行色彩渲染,有以下两种方法可以实现:
- 改变偏移量
即保持矩阵其他列的值不变,只改变最后一列的值来是图片的rgb值发生变化
- 改变rgba值分量的系数
使r、g、b、a分量的系数改变,即使原矩阵乘以对角矩阵使得每个值发生不同的改变来进行色调的改变。
二、相机的基本原理
openGL ES
在制作Camera前还需要向大家介绍一下openGL ES本人也是第一次接触这个技术,所以有一些地方并是很理解,个人感觉这项技术对于新手不是很容易接受。
并且在安卓中,OpenGL ES的开发有基本着固定的代码形式,为实现不同的功能,只需将shader编写好,按步就班的在代码中调用就可以了,但是OpenGL ES提供的API比较抽象,写起来不容易记忆,而且重复代码也比较多。
制作一个camera
1.新建一个Android project
这是很基本的操作想必大家也都清楚,如果有初学者,新建Android project这是基本的新建方法。
2.集成camera框架到项目中
在project/build.grdle文件中添加依赖:
allprojects {
repositories {
…
maven { url ‘https://jitpack.io’ }
}
}
在app/build.grdle文件中添加依赖:
dependencies {
implementation ‘com.github.smzhldr:AGLFramework:v1.0’
}
调用美颜相机:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=“.CameraActivity”>
<com.aglframework.smzh.camera.CameraPreview
android:id=“@+id/camera_preview”
android:layout_width=“match_parent”
android:layout_height=“match_parent” />
在Activity中加入以下代码:
public class CameraActivity extends Activity {
private AGLView aglView;
private AGLCamera1 aglCamera1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camea);
aglView = findViewById(R.id.camera_preview);
}
@Override
protected void onResume() {
super.onResume();
if (aglCamera1 == null) {
aglCamera1 = new AGLCamera1(aglView, 1080, 1920);
}
aglCamera1.open();
}
}
@Override
protected void onPause() {
super.onPause();
if (aglCamera1 != null) {
aglCamera1.close();
}
}
}
====================================================================
将 4x5 矩阵转换成一维数组,然后再将这一维数组设置到ColorMatrix类里去:
//将矩阵设置到图像
private void setImageMatrix() {
Bitmap bmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.set(mColorMatrix);//将一维数组设置到ColorMatrix
Canvas canvas = new Canvas(bmp);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
canvas.drawBitmap(bitmap, 0, 0, paint);
iv_photo.setImageBitmap(bmp);
}
xml布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=“com.example.deeson.mycolormatrix.MainActivity”
android:orientation=“vertical”>
<ImageView
android:id=“@+id/iv_photo”
android:layout_width=“300dp”
android:layout_height=“0dp”
android:layout_weight=“3”
android:layout_gravity=“center_horizontal”/>
<GridLayout
android:id=“@+id/matrix_layout”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“4”
android:columnCount=“5”
android:rowCount=“4”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:orientation=“horizontal”>
<Button
android:id=“@+id/btn_change”
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:text=“change”/>
<Button
android:id=“@+id/btn_reset”
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:text=“reset”/>
通过 View 的 post() 方法,在视图创建完毕后获得其宽高值:
matrixLayout.post(new Runnable() {
@Override
public void run() {
mEtWidth = matrixLayout.getWidth() / 5;
mEtHeight = matrixLayout.getHeight() / 4;
addEts();
initMatrix();
}
});
MainActivity代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Bitmap bitmap;
ImageView iv_photo;
GridLayout matrixLayout;
//每个edittext的宽高
int mEtWidth;
int mEtHeight;
//保存20个edittext
EditText[] mEts = new EditText[20];
//一维数组保存20个矩阵值
float[] mColorMatrix = new float[20];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.iv_model);
iv_photo = (ImageView) findViewById(R.id.iv_photo);
matrixLayout = (GridLayout) findViewById(R.id.matrix_layout);
Button btn_change = (Button) findViewById(R.id.btn_change);
Button btn_reset = (Button) findViewById(R.id.btn_reset);
btn_change.setOnClickListener(this);
btn_reset.setOnClickListener(this);
iv_photo.setImageBitmap(bitmap);
//我们无法在onCreate()方法中获得视图的宽高值,所以通过View的post()方法,在视图创建完毕后获得其宽高值
matrixLayout.post(new Runnable() {
@Override
public void run() {
mEtWidth = matrixLayout.getWidth() / 5;
mEtHeight = matrixLayout.getHeight() / 4;
addEts();
initMatrix();
}
});
}
//动态添加edittext
private void addEts() {
for (int i = 0; i < 20; i++) {
EditText et = new EditText(this);
et.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
mEts[i] = et;
matrixLayout.addView(et, mEtWidth, mEtHeight);
}
}
//初始化颜色矩阵
private void initMatrix() {
for (int i = 0; i < 20; i++) {
if (i % 6 == 0) {
mEts[i].setText(String.valueOf(1));
} else {
mEts[i].setText(String.valueOf(0));
}
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
}
//初始化颜色矩阵
private void initMatrix() {
for (int i = 0; i < 20; i++) {
if (i % 6 == 0) {
mEts[i].setText(String.valueOf(1));
} else {
mEts[i].setText(String.valueOf(0));
}
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-dZI1bhXc-79)]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
今天的文章 如何开发Android美颜相机分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/78494.html