1. 程式人生 > >android開發 修改圖片色調飽和度、色相、亮度處理

android開發 修改圖片色調飽和度、色相、亮度處理

\

處理後:

\

下面貼程式碼:

一、圖片處理層:

package com.jacp.tone.view;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

import com.jacp.tone.R;

/**
 * 圖片調色處理
 * @author 
[email protected]
* */ public class ToneLayer { /** * 飽和度標識 */ public static final int FLAG_SATURATION = 0x0; /** * 亮度標識 */ public static final int FLAG_LUM = 0x1; /** * 色相標識 */ public static final int FLAG_HUE = 0x2; /** * 飽和度 */ private TextView mSaturation; private SeekBar mSaturationBar; /** * 色相 */ private TextView mHue; private SeekBar mHueBar; /** * 亮度 */ private TextView mLum; private SeekBar mLumBar; private float mDensity; private static final int TEXT_WIDTH = 50; private LinearLayout mParent; private ColorMatrix mLightnessMatrix; private ColorMatrix mSaturationMatrix; private ColorMatrix mHueMatrix; private ColorMatrix mAllMatrix; /** * 亮度 */ private float mLumValue = 1F; /** * 飽和度 */ private float mSaturationValue = 0F; /** * 色相 */ private float mHueValue = 0F; /** * SeekBar的中間值 */ private static final int MIDDLE_VALUE = 127; /** * SeekBar的最大值 */ private static final int MAX_VALUE = 255; private ArrayList<SeekBar> mSeekBars = new ArrayList<SeekBar>(); public ToneLayer(Context context) { init(context); } private void init(Context context) { mDensity = context.getResources().getDisplayMetrics().density; mSaturation = new TextView(context); mSaturation.setText(R.string.saturation); mHue = new TextView(context); mHue.setText(R.string.contrast); mLum = new TextView(context); mLum.setText(R.string.lightness); mSaturationBar = new SeekBar(context); mHueBar = new SeekBar(context); mLumBar = new SeekBar(context); mSeekBars.add(mSaturationBar); mSeekBars.add(mHueBar); mSeekBars.add(mLumBar); for (int i = 0, size = mSeekBars.size(); i < size; i++) { SeekBar seekBar = mSeekBars.get(i); seekBar.setMax(MAX_VALUE); seekBar.setProgress(MIDDLE_VALUE); seekBar.setTag(i); } LinearLayout saturation = new LinearLayout(context); saturation.setOrientation(LinearLayout.HORIZONTAL); saturation.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); LinearLayout.LayoutParams txtLayoutparams = new LinearLayout.LayoutParams((int) (TEXT_WIDTH * mDensity), LinearLayout.LayoutParams.MATCH_PARENT); mSaturation.setGravity(Gravity.CENTER); saturation.addView(mSaturation, txtLayoutparams); LinearLayout.LayoutParams seekLayoutparams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); saturation.addView(mSaturationBar, seekLayoutparams); LinearLayout hue = new LinearLayout(context); hue.setOrientation(LinearLayout.HORIZONTAL); hue.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); mHue.setGravity(Gravity.CENTER); hue.addView(mHue, txtLayoutparams); hue.addView(mHueBar, seekLayoutparams); LinearLayout lum = new LinearLayout(context); lum.setOrientation(LinearLayout.HORIZONTAL); lum.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); mLum.setGravity(Gravity.CENTER); lum.addView(mLum, txtLayoutparams); lum.addView(mLumBar, seekLayoutparams); mParent = new LinearLayout(context); mParent.setOrientation(LinearLayout.VERTICAL); mParent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); mParent.addView(saturation); mParent.addView(hue); mParent.addView(lum); } public View getParentView() { return mParent; } /** * 設定飽和度值 * @param saturation */ public void setSaturation(int saturation) { mSaturationValue = saturation * 1.0F / MIDDLE_VALUE; } /** * 設定色相值 * @param hue */ public void setHue(int hue) { mHueValue = hue * 1.0F / MIDDLE_VALUE; } /** * 設定亮度值 * @param lum */ public void setLum(int lum) { mLumValue = (lum - MIDDLE_VALUE) * 1.0F / MIDDLE_VALUE * 180; } public ArrayList<SeekBar> getSeekBars() { return mSeekBars; } /** * * @param flag * 位元位0 表示是否改變色相,比位1表示是否改變飽和度,位元位2表示是否改變明亮度 */ public Bitmap handleImage(Bitmap bm, int flag) { Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888); // 建立一個相同尺寸的可變的點陣圖區,用於繪製調色後的圖片 Canvas canvas = new Canvas(bmp); // 得到畫筆物件 Paint paint = new Paint(); // 新建paint paint.setAntiAlias(true); // 設定抗鋸齒,也即是邊緣做平滑處理 if (null == mAllMatrix) { mAllMatrix = new ColorMatrix(); } if (null == mLightnessMatrix) { mLightnessMatrix = new ColorMatrix(); // 用於顏色變換的矩陣,android點陣圖顏色變化處理主要是靠該物件完成 } if (null == mSaturationMatrix) { mSaturationMatrix = new ColorMatrix(); } if (null == mHueMatrix) { mHueMatrix = new ColorMatrix(); } switch (flag) { case FLAG_HUE: // 需要改變色相 mHueMatrix.reset(); mHueMatrix.setScale(mHueValue, mHueValue, mHueValue, 1); // 紅、綠、藍三分量按相同的比例,最後一個引數1表示透明度不做變化,此函式詳細說明參考 // // android // doc break; case FLAG_SATURATION: // 需要改變飽和度 // saturation 飽和度值,最小可設為0,此時對應的是灰度圖(也就是俗話的“黑白圖”), // 為1表示飽和度不變,設定大於1,就顯示過飽和 mSaturationMatrix.reset(); mSaturationMatrix.setSaturation(mSaturationValue); break; case FLAG_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(new ColorMatrixColorFilter(mAllMatrix));// 設定顏色變換效果 canvas.drawBitmap(bm, 0, 0, paint); // 將顏色變化後的圖片輸出到新建立的點陣圖區 // 返回新的點陣圖,也即調色處理後的圖片 return bmp; } }


二、主介面:

package com.jacp.tone;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

import com.jacp.tone.view.ToneLayer;

/**
 * 啟動的主介面
 * @author 
[email protected]
* */ public class ImageToneActivity extends Activity implements OnSeekBarChangeListener { private ToneLayer mToneLayer; private ImageView mImageView; private Bitmap mBitmap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init() { mToneLayer = new ToneLayer(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 (int i = 0, size = seekBars.size(); i < size; i++) { seekBars.get(i).setOnSeekBarChangeListener(this); } } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int flag = (Integer) seekBar.getTag(); switch (flag) { case ToneLayer.FLAG_SATURATION: mToneLayer.setSaturation(progress); break; case ToneLayer.FLAG_LUM: mToneLayer.setLum(progress); break; case ToneLayer.FLAG_HUE: mToneLayer.setHue(progress); break; } mImageView.setImageBitmap(mToneLayer.handleImage(mBitmap, flag)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }


三、佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns: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>

相關推薦

android開發 修改圖片色調飽和度色相亮度處理

處理後: 下面貼程式碼: 一、圖片處理層: package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.gra

Android開發:SharedPreferences 存儲數據獲取數據

.get 本地 www phone win7 popu ces androi studio Android開發:SharedPreferences 存儲數據、獲取數據 email:[email protected]/* */ 開發環境:w

Android開發中怎樣用多進程用多進程的好處多進程的缺陷解決方法(轉)

傳遞 標簽 事情 打印 ide 即時通訊 ice cati 一個數 轉自:http://blog.csdn.net/spencer_hale/article/details/54968092 1.怎樣用多進程 Android多進程概念:一般情況下,一個應用程序就是一個進

Android開發-Handler引起的記憶體洩漏-實驗分析總結。

介紹 最近在惡補Handler的知識,其中就涉及到了Handler引起的記憶體洩露問題,網路上有很多的分析文章。我就按照這些文章的思路,寫程式碼驗證,主要是驗證和記錄。  使用的記憶體檢測工具是:LeakCanary 中文使用說明 英文原文: http://www

OpenCV修改圖片畫素值增加減少

程式碼位置:11-ImagePixelsBeChange.py import cv2 import numpy as np img = cv2.imread('./res/mini.jpeg') cv2.imshow('img', img) num = np.zeros(img.sh

Android開發 -- .9圖片原理和Draw 9-patch工具的使用

一. .9圖片的介紹 .9圖片的作用: 1. 主要防止圖片被拉伸後變形。因為在一個畫素裡如果是相同色塊,那麼它被拉伸不會變形。但如何該畫素裡有不同色塊,就將導致它變形。 2.通過.9圖片可以把圖片做的很小,不佔資源,減少apk的大小 下面我們來看一下,同一張圖片使用了.9

Android Glide載入圖片時轉換為圓形圓角毛玻璃等圖片效果

Android Glide載入圖片時轉換為圓形、圓角、毛玻璃等圖片效果 附錄1簡單介紹了Android開源的圖片載入框架。在實際的開發中,雖然Glide解決了快速載入圖片的問題,但還有一個問題懸而未決:比如使用者的頭像,往往使用者的頭像是從伺服器端讀出的一個普通矩形圖片

android開發base64圖片顯示

Log.d("pmftest", "onResponse: 圖片"+photoback); Bitmap bitmap=null; byte[]bitmapArray; bitmapArray=Base64.decode(photoback, Base64.DEFAU

Android開發學習之ImageView手勢拖拽縮放旋轉

           在Android應用中,圖片隨手勢的拖拽、縮放、旋轉在很多場景中都會用到,今天我們要做的就是在ImageView的基礎上實現一個可以拖拽、縮放、轉轉的TouchView。              一、實現原理              OnTouc

Android開發---AUIL圖片載入框架的使用

AUIL圖片載入框架 使用步驟 注意:要顯示imageloader的圓角效果 imageview必須固定寬高 1.匯入jar包 universal-image-loader.jar 第一個就可以了 2.新增許可權 <uses-permissionandroid:na

關於Android開發圖片的三級快取機制

1.Android應用中聯網載入並顯示圖片時,為了使用者體驗和節省流量,一定用到圖片的快取。 2.關於三級快取的理解:記憶體快取(強引用儲存)、記憶體快取(軟引用快取)、記憶體快取(弱引用快取)、檔案快取(就是將圖片儲存為本地檔案),由此組成三級快取。 3.關於JAVA中的

Android開發圖片載入快取框架Picasso的領教

Picasso實現了圖片的非同步載入,並解決了Android中載入圖片時常見的一些問題,它有以下特點: 在Adapter中取消了不在檢視範圍內的ImageView的資源載入,因為可能會產生圖片錯

Android開發中libs包下面的mipsarmeabiarmeabi-v7a和x86

簡介 在Android日常的開發過程中有的專案需要引入第三方的庫,有時候大家可能會在libs資料夾下看到 mips、armeabi、armeabi-v7a和x86這四個資料夾。那麼這三個資料夾下面

Android開發圖片的適配

全面理解imageview的ScaleType屬性,並做好適配 前言:Android機型的種類大家都知道,適配一直都是一個大問題。所以一直以來對於開發者都是用多套圖來做適配。這樣做可以解決部分適配問題,但是缺點就是給app帶來了負擔,導致app包特別的大。

Android開發網路圖片完整顯示且不拉伸

      需求:由上往下載入多張網路圖片,滿橫屏完整顯示且不拉伸。       這裡有幾個問題要解決的,一個是網路圖片,一個是完整顯示,一個是圖片不能出現拉伸問題。       解決思路:不拉伸完整顯示只有等比例縮放圖片,ImageView.ScaleType.CENTE

android 通過修改圖片畫素實現CircleImageView

CircleImageView實現方法有很多種,各有優缺點,因此需要按照不同的場景使用。我們今天使用修改圖片畫素的方法實現Circ

android開發 用執行緒進行耗時操作,統一處理

最近專案中,發現程式的反應實在有點慢,主執行緒中的耗時操作多了點,但沒有時間去改,就想寫個公用類,專門用來處理這些耗時操作,於是寫了個 ThreadUtil, 思路是在util中使用一個單例執行緒池,然後用反射的方法去呼叫需要被呼叫的方法,然後用handler去協調,程式碼

android button背景圖片不拉伸的一種處理方法

一般來說UI給的圖片比例應該和控制元件是正好符合的,但是實際操作過程中會發現可能不符合的情況,比例不對直接設定background的話background會被拉伸,這個時候一般來說如果能像ImageView一樣設定scaleType為centerCrop或者center就好了

Android 圖片特效(一):色相飽和度亮度

    平時的圖片在使用了美圖秀秀之後就會呈現不一樣的效果,就像上面的圖片展示的那樣(上圖是一張美圖秀秀的使用截圖)。實際上上面的效果離不開色彩的三要素——色相、飽和度和亮度。人眼看到的任一彩色光都是這三個特性的綜合效果。其中色調與光波的波長有直接關係,亮度

Android開發:通過樣式修改SeekBar背景顏色,進度條顏色,滑塊圖片

通過樣式style修改 seekBar 的 背景、進度、遊標等圖片。 佈局檔案: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.and