android图像处理之色相,亮度,饱和度设置

相信大家都有用过美图秀秀这样的图像处理软件吧,它可以创造出绚丽多彩的图片。其中熟悉的就是色相,亮度,饱和度调节。通过调节以上属性,可以呈现出不同的效果,原理很简单,其实他就是设置了不同的颜色矩阵。今天,我们一窥android图像处理。

这是布局文件,我在代码中项GridView动态添加了20个EditText

<?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=".MainActivity">

   <ImageView
       android:layout_width="300dp"
       android:layout_centerHorizontal="true"
       android:layout_marginTop="20dp"
       android:id="@+id/img"
       android:layout_height="250dp" />

    <GridLayout
        android:layout_width="match_parent"
        android:id="@+id/gridLayout"
        android:layout_below="@+id/img"
        android:rowCount="4"
        android:columnCount="5"
        android:layout_height="200dp">
    </GridLayout>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="还原"
        android:onClick="backUp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="504dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="图像处理"
        android:onClick="handleImg"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="173dp"
        android:layout_marginStart="173dp"
        android:layout_marginTop="504dp" />
</RelativeLayout>

现在看Activity

package com.ityang.learnmoudle;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private ImageView img;
    private GridLayout gridLayout;
    private static final int SIZE = 20;
    private float[] texts = new float[SIZE];
    private EditText[] editTexts = new EditText[SIZE];
    private Bitmap sourceBitmap;

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

        initView();
    }

    /**
     * 初始化
     */
    private void initView() {
        img = (ImageView) findViewById(R.id.img);
        gridLayout = (GridLayout) findViewById(R.id.gridLayout);
        //当gridview绘制完毕后回调该方法可以测出实际宽度
        gridLayout.post(new Runnable() {
            @Override
            public void run() {
                int gridWidth = gridLayout.getWidth()/5;
                int gridHeight = gridLayout.getHeight()/4;
                for (int i = 0; i < SIZE; i++) {
                    EditText editText = new EditText(MainActivity.this);
                    editTexts[i] = editText;
                    gridLayout.addView(editText,gridWidth,gridHeight);
                }
                initTexts();
            }
        });
        sourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.photo);
        img.setImageBitmap(sourceBitmap);
    }

    /**
     * 初始化输入框数值
     */
    private void initTexts() {
        for (int i = 0; i < SIZE; i++) {
            if (i % 6 == 0) {
                editTexts[i].setText("1");
            } else {
                editTexts[i].setText("0");
            }
        }
    }

    /**
     * 还原
     *
     * @param view
     */
    public void backUp(View view) {
        initTexts();
        img.setImageBitmap(sourceBitmap);
    }

    public void handleImg(View view) {
        Bitmap resultBitmap = handle();
        if(resultBitmap!=null) {
            img.setImageBitmap(resultBitmap);
        }
    }

    /**
     * 楚翔处理关键类
     *
     * @return
     */
    public Bitmap handle() {
        //获取输入框内容保存到数组中
        try {
            for (int i = 0; i < SIZE; i++) {
                texts[i] = Float.valueOf(editTexts[i].getText().toString());
            }
            Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight(), Bitmap.Config.ARGB_8888);
            //准备画布
            Canvas canvas = new Canvas(resultBitmap);
            //抗锯齿画笔
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            //颜色矩阵设置
            paint.setColorFilter(new ColorMatrixColorFilter(texts));
            canvas.drawBitmap(sourceBitmap, 0, 0, paint);
            return resultBitmap;
        } catch (NumberFormatException e) {
            e.printStackTrace();
            Toast.makeText(this, "错误", Toast.LENGTH_SHORT).show();
        }
        return null;
    }
}

相信大家都能看懂,唯一疑惑的可能就是handle方法,大家肯定都知道,每次图像处理,变化的就是texts数组,我们通过texts数组生成颜色矩阵,因为颜色矩阵是4*5矩阵,这也就解释了为什么数组大小是20,把颜色矩阵设置给画笔,这样每次都能返回不同效果的bitmap.Ok,现在你看懂有对颜色矩阵很困惑吧,它到底是什么呢?关于颜色矩阵的问题,由于它是在不是一两句话就能解释清楚的,抱歉,这里就不做介绍了,大家可以访问 http://tieba.baidu.com/p/1730549463,上面有详细介绍,相信大家看了之后会有深刻的理解。

现在来看看程序运行效果图吧,我没有用模拟器,是真机测试。

195350_FDpm_2434774.png195351_7aqs_2434774.png  195351_SEz5_2434774.png

看了上面的效果图后,你是不是也想去试一试呢?


转载于:https://my.oschina.net/u/2434774/blog/636347

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值