转自:http://blog.csdn.net/luohai859/article/details/25388441
原图:
处理后:
下面贴代码:
一、图片处理层:
- packagecom.jacp.tone.view;
- importjava.util.ArrayList;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.Canvas;
- importandroid.graphics.ColorMatrix;
- importandroid.graphics.ColorMatrixColorFilter;
- importandroid.graphics.Paint;
- importandroid.view.Gravity;
- importandroid.view.View;
- importandroid.widget.LinearLayout;
- importandroid.widget.SeekBar;
- importandroid.widget.SeekBar.OnSeekBarChangeListener;
- importandroid.widget.TextView;
- importcom.jacp.tone.R;
- /**
- *图片调色处理
- *@authormaylian7700@126.com
- *
- */
- publicclassToneLayer{
- /**
- *饱和度标识
- */
- publicstaticfinalintFLAG_SATURATION=0x0;
- /**
- *亮度标识
- */
- publicstaticfinalintFLAG_LUM=0x1;
- /**
- *色相标识
- */
- publicstaticfinalintFLAG_HUE=0x2;
- /**
- *饱和度
- */
- privateTextViewmSaturation;
- privateSeekBarmSaturationBar;
- /**
- *色相
- */
- privateTextViewmHue;
- privateSeekBarmHueBar;
- /**
- *亮度
- */
- privateTextViewmLum;
- privateSeekBarmLumBar;
- privatefloatmDensity;
- privatestaticfinalintTEXT_WIDTH=50;
- privateLinearLayoutmParent;
- privateColorMatrixmLightnessMatrix;
- privateColorMatrixmSaturationMatrix;
- privateColorMatrixmHueMatrix;
- privateColorMatrixmAllMatrix;
- /**
- *亮度
- */
- privatefloatmLumValue=1F;
- /**
- *饱和度
- */
- privatefloatmSaturationValue=0F;
- /**
- *色相
- */
- privatefloatmHueValue=0F;
- /**
- *SeekBar的中间值
- */
- privatestaticfinalintMIDDLE_VALUE=127;
- /**
- *SeekBar的最大值
- */
- privatestaticfinalintMAX_VALUE=255;
- privateArrayList<SeekBar>mSeekBars=newArrayList<SeekBar>();
- publicToneLayer(Contextcontext){
- init(context);
- }
- privatevoidinit(Contextcontext){
- mDensity=context.getResources().getDisplayMetrics().density;
- mSaturation=newTextView(context);
- mSaturation.setText(R.string.saturation);
- mHue=newTextView(context);
- mHue.setText(R.string.contrast);
- mLum=newTextView(context);
- mLum.setText(R.string.lightness);
- mSaturationBar=newSeekBar(context);
- mHueBar=newSeekBar(context);
- mLumBar=newSeekBar(context);
- mSeekBars.add(mSaturationBar);
- mSeekBars.add(mHueBar);
- mSeekBars.add(mLumBar);
- for(inti=0,size=mSeekBars.size();i<size;i++){
- SeekBarseekBar=mSeekBars.get(i);
- seekBar.setMax(MAX_VALUE);
- seekBar.setProgress(MIDDLE_VALUE);
- seekBar.setTag(i);
- }
- LinearLayoutsaturation=newLinearLayout(context);
- saturation.setOrientation(LinearLayout.HORIZONTAL);
- saturation.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
- LinearLayout.LayoutParamstxtLayoutparams=newLinearLayout.LayoutParams((int)(TEXT_WIDTH*mDensity),LinearLayout.LayoutParams.MATCH_PARENT);
- mSaturation.setGravity(Gravity.CENTER);
- saturation.addView(mSaturation,txtLayoutparams);
- LinearLayout.LayoutParamsseekLayoutparams=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
- saturation.addView(mSaturationBar,seekLayoutparams);
- LinearLayouthue=newLinearLayout(context);
- hue.setOrientation(LinearLayout.HORIZONTAL);
- hue.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
- mHue.setGravity(Gravity.CENTER);
- hue.addView(mHue,txtLayoutparams);
- hue.addView(mHueBar,seekLayoutparams);
- LinearLayoutlum=newLinearLayout(context);
- lum.setOrientation(LinearLayout.HORIZONTAL);
- lum.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
- mLum.setGravity(Gravity.CENTER);
- lum.addView(mLum,txtLayoutparams);
- lum.addView(mLumBar,seekLayoutparams);
- mParent=newLinearLayout(context);
- mParent.setOrientation(LinearLayout.VERTICAL);
- mParent.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
- mParent.addView(saturation);
- mParent.addView(hue);
- mParent.addView(lum);
- }
- publicViewgetParentView(){
- returnmParent;
- }
- /**
- *设置饱和度值
- *@paramsaturation
- */
- publicvoidsetSaturation(intsaturation){
- mSaturationValue=saturation*1.0F/MIDDLE_VALUE;
- }
- /**
- *设置色相值
- *@paramhue
- */
- publicvoidsetHue(inthue){
- mHueValue=hue*1.0F/MIDDLE_VALUE;
- }
- /**
- *设置亮度值
- *@paramlum
- */
- publicvoidsetLum(intlum){
- mLumValue=(lum-MIDDLE_VALUE)*1.0F/MIDDLE_VALUE*180;
- }
- publicArrayList<SeekBar>getSeekBars()
- {
- returnmSeekBars;
- }
- /**
- *
- *@paramflag
- *比特位0表示是否改变色相,比位1表示是否改变饱和度,比特位2表示是否改变明亮度
- */
- publicBitmaphandleImage(Bitmapbm,intflag){
- Bitmapbmp=Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),
- Bitmap.Config.ARGB_8888);
- //创建一个相同尺寸的可变的位图区,用于绘制调色后的图片
- Canvascanvas=newCanvas(bmp);//得到画笔对象
- Paintpaint=newPaint();//新建paint
- paint.setAntiAlias(true);//设置抗锯齿,也即是边缘做平滑处理
- if(null==mAllMatrix){
- mAllMatrix=newColorMatrix();
- }
- if(null==mLightnessMatrix){
- mLightnessMatrix=newColorMatrix();//用于颜色变换的矩阵,android位图颜色变化处理主要是靠该对象完成
- }
- if(null==mSaturationMatrix){
- mSaturationMatrix=newColorMatrix();
- }
- if(null==mHueMatrix){
- mHueMatrix=newColorMatrix();
- }
- switch(flag){
- caseFLAG_HUE://需要改变色相
- mHueMatrix.reset();
- mHueMatrix.setScale(mHueValue,mHueValue,mHueValue,1);//红、绿、蓝三分量按相同的比例,最后一个参数1表示透明度不做变化,此函数详细说明参考
- android
- //doc
- break;
- caseFLAG_SATURATION://需要改变饱和度
- //saturation饱和度值,最小可设为0,此时对应的是灰度图(也就是俗话的“黑白图”),
- //为1表示饱和度不变,设置大于1,就显示过饱和
- mSaturationMatrix.reset();
- mSaturationMatrix.setSaturation(mSaturationValue);
- break;
- caseFLAG_LUM://亮度
- //hueColor就是色轮旋转的角度,正值表示顺时针旋转,负值表示逆时针旋转
- mLightnessMatrix.reset();//设为默认值
- mLightnessMatrix.setRotate(0,mLumValue);//控制让红色区在色轮上旋转的角度
- mLightnessMatrix.setRotate(1,mLumValue);//控制让绿红色区在色轮上旋转的角度
- mLightnessMatrix.setRotate(2,mLumValue);//控制让蓝色区在色轮上旋转的角度
- //这里相当于改变的是全图的色相
- break;
- }
- mAllMatrix.reset();
- mAllMatrix.postConcat(mHueMatrix);
- mAllMatrix.postConcat(mSaturationMatrix);//效果叠加
- mAllMatrix.postConcat(mLightnessMatrix);//效果叠加
- paint.setColorFilter(newColorMatrixColorFilter(mAllMatrix));//设置颜色变换效果
- canvas.drawBitmap(bm,0,0,paint);//将颜色变化后的图片输出到新创建的位图区
- //返回新的位图,也即调色处理后的图片
- returnbmp;
- }
- }
二、主界面:
- packagecom.jacp.tone;
- importjava.util.ArrayList;
- importandroid.app.Activity;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.os.Bundle;
- importandroid.widget.ImageView;
- importandroid.widget.LinearLayout;
- importandroid.widget.SeekBar;
- importandroid.widget.SeekBar.OnSeekBarChangeListener;
- importcom.jacp.tone.view.ToneLayer;
- /**
- *启动的主界面
- *@authormaylian7700@126.com
- *
- */
- publicclassImageToneActivityextendsActivityimplementsOnSeekBarChangeListener{
- privateToneLayermToneLayer;
- privateImageViewmImageView;
- privateBitmapmBitmap;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- init();
- }
- privatevoidinit()
- {
- mToneLayer=newToneLayer(this);
- mBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
- mImageView=(ImageView)findViewById(R.id.img_view);
- mImageView.setImageBitmap(mBitmap);
- ((LinearLayout)findViewById(R.id.tone_view)).addView(mToneLayer.getParentView());
- ArrayList<SeekBar>seekBars=mToneLayer.getSeekBars();
- for(inti=0,size=seekBars.size();i<size;i++)
- {
- seekBars.get(i).setOnSeekBarChangeListener(this);
- }
- }
- @Override
- publicvoidonProgressChanged(SeekBarseekBar,intprogress,
- booleanfromUser){
- intflag=(Integer)seekBar.getTag();
- switch(flag)
- {
- caseToneLayer.FLAG_SATURATION:
- mToneLayer.setSaturation(progress);
- break;
- caseToneLayer.FLAG_LUM:
- mToneLayer.setLum(progress);
- break;
- caseToneLayer.FLAG_HUE:
- mToneLayer.setHue(progress);
- break;
- }
- mImageView.setImageBitmap(mToneLayer.handleImage(mBitmap,flag));
- }
- @Override
- publicvoidonStartTrackingTouch(SeekBarseekBar){
- }
- @Override
- publicvoidonStopTrackingTouch(SeekBarseekBar){
- }
- }
三、布局文件:
- <?xmlversion="1.0"encoding="utf-8"?>
- <ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:id="@+id/img_view"
- android:layout_gravity="center"
- />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/tone_view"
- />
- </LinearLayout>
- </ScrollView>