`
445822357
  • 浏览: 744125 次
文章分类
社区版块
存档分类
最新评论

android图像处理系列之三--图片色调饱和度、色相、亮度处理

 
阅读更多

转自:http://blog.csdn.net/luohai859/article/details/25388441

原图:


处理后:


下面贴代码:

一、图片处理层:

  1. packagecom.jacp.tone.view;
  2. importjava.util.ArrayList;
  3. importandroid.content.Context;
  4. importandroid.graphics.Bitmap;
  5. importandroid.graphics.Canvas;
  6. importandroid.graphics.ColorMatrix;
  7. importandroid.graphics.ColorMatrixColorFilter;
  8. importandroid.graphics.Paint;
  9. importandroid.view.Gravity;
  10. importandroid.view.View;
  11. importandroid.widget.LinearLayout;
  12. importandroid.widget.SeekBar;
  13. importandroid.widget.SeekBar.OnSeekBarChangeListener;
  14. importandroid.widget.TextView;
  15. importcom.jacp.tone.R;
  16. /**
  17. *图片调色处理
  18. *@authormaylian7700@126.com
  19. *
  20. */
  21. publicclassToneLayer{
  22. /**
  23. *饱和度标识
  24. */
  25. publicstaticfinalintFLAG_SATURATION=0x0;
  26. /**
  27. *亮度标识
  28. */
  29. publicstaticfinalintFLAG_LUM=0x1;
  30. /**
  31. *色相标识
  32. */
  33. publicstaticfinalintFLAG_HUE=0x2;
  34. /**
  35. *饱和度
  36. */
  37. privateTextViewmSaturation;
  38. privateSeekBarmSaturationBar;
  39. /**
  40. *色相
  41. */
  42. privateTextViewmHue;
  43. privateSeekBarmHueBar;
  44. /**
  45. *亮度
  46. */
  47. privateTextViewmLum;
  48. privateSeekBarmLumBar;
  49. privatefloatmDensity;
  50. privatestaticfinalintTEXT_WIDTH=50;
  51. privateLinearLayoutmParent;
  52. privateColorMatrixmLightnessMatrix;
  53. privateColorMatrixmSaturationMatrix;
  54. privateColorMatrixmHueMatrix;
  55. privateColorMatrixmAllMatrix;
  56. /**
  57. *亮度
  58. */
  59. privatefloatmLumValue=1F;
  60. /**
  61. *饱和度
  62. */
  63. privatefloatmSaturationValue=0F;
  64. /**
  65. *色相
  66. */
  67. privatefloatmHueValue=0F;
  68. /**
  69. *SeekBar的中间值
  70. */
  71. privatestaticfinalintMIDDLE_VALUE=127;
  72. /**
  73. *SeekBar的最大值
  74. */
  75. privatestaticfinalintMAX_VALUE=255;
  76. privateArrayList<SeekBar>mSeekBars=newArrayList<SeekBar>();
  77. publicToneLayer(Contextcontext){
  78. init(context);
  79. }
  80. privatevoidinit(Contextcontext){
  81. mDensity=context.getResources().getDisplayMetrics().density;
  82. mSaturation=newTextView(context);
  83. mSaturation.setText(R.string.saturation);
  84. mHue=newTextView(context);
  85. mHue.setText(R.string.contrast);
  86. mLum=newTextView(context);
  87. mLum.setText(R.string.lightness);
  88. mSaturationBar=newSeekBar(context);
  89. mHueBar=newSeekBar(context);
  90. mLumBar=newSeekBar(context);
  91. mSeekBars.add(mSaturationBar);
  92. mSeekBars.add(mHueBar);
  93. mSeekBars.add(mLumBar);
  94. for(inti=0,size=mSeekBars.size();i<size;i++){
  95. SeekBarseekBar=mSeekBars.get(i);
  96. seekBar.setMax(MAX_VALUE);
  97. seekBar.setProgress(MIDDLE_VALUE);
  98. seekBar.setTag(i);
  99. }
  100. LinearLayoutsaturation=newLinearLayout(context);
  101. saturation.setOrientation(LinearLayout.HORIZONTAL);
  102. saturation.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
  103. LinearLayout.LayoutParamstxtLayoutparams=newLinearLayout.LayoutParams((int)(TEXT_WIDTH*mDensity),LinearLayout.LayoutParams.MATCH_PARENT);
  104. mSaturation.setGravity(Gravity.CENTER);
  105. saturation.addView(mSaturation,txtLayoutparams);
  106. LinearLayout.LayoutParamsseekLayoutparams=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
  107. saturation.addView(mSaturationBar,seekLayoutparams);
  108. LinearLayouthue=newLinearLayout(context);
  109. hue.setOrientation(LinearLayout.HORIZONTAL);
  110. hue.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
  111. mHue.setGravity(Gravity.CENTER);
  112. hue.addView(mHue,txtLayoutparams);
  113. hue.addView(mHueBar,seekLayoutparams);
  114. LinearLayoutlum=newLinearLayout(context);
  115. lum.setOrientation(LinearLayout.HORIZONTAL);
  116. lum.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
  117. mLum.setGravity(Gravity.CENTER);
  118. lum.addView(mLum,txtLayoutparams);
  119. lum.addView(mLumBar,seekLayoutparams);
  120. mParent=newLinearLayout(context);
  121. mParent.setOrientation(LinearLayout.VERTICAL);
  122. mParent.setLayoutParams(newLinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
  123. mParent.addView(saturation);
  124. mParent.addView(hue);
  125. mParent.addView(lum);
  126. }
  127. publicViewgetParentView(){
  128. returnmParent;
  129. }
  130. /**
  131. *设置饱和度值
  132. *@paramsaturation
  133. */
  134. publicvoidsetSaturation(intsaturation){
  135. mSaturationValue=saturation*1.0F/MIDDLE_VALUE;
  136. }
  137. /**
  138. *设置色相值
  139. *@paramhue
  140. */
  141. publicvoidsetHue(inthue){
  142. mHueValue=hue*1.0F/MIDDLE_VALUE;
  143. }
  144. /**
  145. *设置亮度值
  146. *@paramlum
  147. */
  148. publicvoidsetLum(intlum){
  149. mLumValue=(lum-MIDDLE_VALUE)*1.0F/MIDDLE_VALUE*180;
  150. }
  151. publicArrayList<SeekBar>getSeekBars()
  152. {
  153. returnmSeekBars;
  154. }
  155. /**
  156. *
  157. *@paramflag
  158. *比特位0表示是否改变色相,比位1表示是否改变饱和度,比特位2表示是否改变明亮度
  159. */
  160. publicBitmaphandleImage(Bitmapbm,intflag){
  161. Bitmapbmp=Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),
  162. Bitmap.Config.ARGB_8888);
  163. //创建一个相同尺寸的可变的位图区,用于绘制调色后的图片
  164. Canvascanvas=newCanvas(bmp);//得到画笔对象
  165. Paintpaint=newPaint();//新建paint
  166. paint.setAntiAlias(true);//设置抗锯齿,也即是边缘做平滑处理
  167. if(null==mAllMatrix){
  168. mAllMatrix=newColorMatrix();
  169. }
  170. if(null==mLightnessMatrix){
  171. mLightnessMatrix=newColorMatrix();//用于颜色变换的矩阵,android位图颜色变化处理主要是靠该对象完成
  172. }
  173. if(null==mSaturationMatrix){
  174. mSaturationMatrix=newColorMatrix();
  175. }
  176. if(null==mHueMatrix){
  177. mHueMatrix=newColorMatrix();
  178. }
  179. switch(flag){
  180. caseFLAG_HUE://需要改变色相
  181. mHueMatrix.reset();
  182. mHueMatrix.setScale(mHueValue,mHueValue,mHueValue,1);//红、绿、蓝三分量按相同的比例,最后一个参数1表示透明度不做变化,此函数详细说明参考
  183. ////android
  184. //doc
  185. break;
  186. caseFLAG_SATURATION://需要改变饱和度
  187. //saturation饱和度值,最小可设为0,此时对应的是灰度图(也就是俗话的“黑白图”),
  188. //为1表示饱和度不变,设置大于1,就显示过饱和
  189. mSaturationMatrix.reset();
  190. mSaturationMatrix.setSaturation(mSaturationValue);
  191. break;
  192. caseFLAG_LUM://亮度
  193. //hueColor就是色轮旋转的角度,正值表示顺时针旋转,负值表示逆时针旋转
  194. mLightnessMatrix.reset();//设为默认值
  195. mLightnessMatrix.setRotate(0,mLumValue);//控制让红色区在色轮上旋转的角度
  196. mLightnessMatrix.setRotate(1,mLumValue);//控制让绿红色区在色轮上旋转的角度
  197. mLightnessMatrix.setRotate(2,mLumValue);//控制让蓝色区在色轮上旋转的角度
  198. //这里相当于改变的是全图的色相
  199. break;
  200. }
  201. mAllMatrix.reset();
  202. mAllMatrix.postConcat(mHueMatrix);
  203. mAllMatrix.postConcat(mSaturationMatrix);//效果叠加
  204. mAllMatrix.postConcat(mLightnessMatrix);//效果叠加
  205. paint.setColorFilter(newColorMatrixColorFilter(mAllMatrix));//设置颜色变换效果
  206. canvas.drawBitmap(bm,0,0,paint);//将颜色变化后的图片输出到新创建的位图区
  207. //返回新的位图,也即调色处理后的图片
  208. returnbmp;
  209. }
  210. }


二、主界面:

  1. packagecom.jacp.tone;
  2. importjava.util.ArrayList;
  3. importandroid.app.Activity;
  4. importandroid.graphics.Bitmap;
  5. importandroid.graphics.BitmapFactory;
  6. importandroid.os.Bundle;
  7. importandroid.widget.ImageView;
  8. importandroid.widget.LinearLayout;
  9. importandroid.widget.SeekBar;
  10. importandroid.widget.SeekBar.OnSeekBarChangeListener;
  11. importcom.jacp.tone.view.ToneLayer;
  12. /**
  13. *启动的主界面
  14. *@authormaylian7700@126.com
  15. *
  16. */
  17. publicclassImageToneActivityextendsActivityimplementsOnSeekBarChangeListener{
  18. privateToneLayermToneLayer;
  19. privateImageViewmImageView;
  20. privateBitmapmBitmap;
  21. @Override
  22. publicvoidonCreate(BundlesavedInstanceState){
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.main);
  25. init();
  26. }
  27. privatevoidinit()
  28. {
  29. mToneLayer=newToneLayer(this);
  30. mBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
  31. mImageView=(ImageView)findViewById(R.id.img_view);
  32. mImageView.setImageBitmap(mBitmap);
  33. ((LinearLayout)findViewById(R.id.tone_view)).addView(mToneLayer.getParentView());
  34. ArrayList<SeekBar>seekBars=mToneLayer.getSeekBars();
  35. for(inti=0,size=seekBars.size();i<size;i++)
  36. {
  37. seekBars.get(i).setOnSeekBarChangeListener(this);
  38. }
  39. }
  40. @Override
  41. publicvoidonProgressChanged(SeekBarseekBar,intprogress,
  42. booleanfromUser){
  43. intflag=(Integer)seekBar.getTag();
  44. switch(flag)
  45. {
  46. caseToneLayer.FLAG_SATURATION:
  47. mToneLayer.setSaturation(progress);
  48. break;
  49. caseToneLayer.FLAG_LUM:
  50. mToneLayer.setLum(progress);
  51. break;
  52. caseToneLayer.FLAG_HUE:
  53. mToneLayer.setHue(progress);
  54. break;
  55. }
  56. mImageView.setImageBitmap(mToneLayer.handleImage(mBitmap,flag));
  57. }
  58. @Override
  59. publicvoidonStartTrackingTouch(SeekBarseekBar){
  60. }
  61. @Override
  62. publicvoidonStopTrackingTouch(SeekBarseekBar){
  63. }
  64. }


三、布局文件:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:orientation="vertical">
  10. <ImageView
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_weight="1"
  14. android:id="@+id/img_view"
  15. android:layout_gravity="center"
  16. />
  17. <LinearLayout
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:id="@+id/tone_view"
  21. />
  22. </LinearLayout>
  23. </ScrollView>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics