在OPhone编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。这些效果在OPhone中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以xx的做出上面的所说的效果,下面将分别介绍这两个矩阵的用法和相关的函数。
- CMatrix类:
- public class CMatrix extends Activity?{
- private Button?change;
- private EditText?[]?et=new EditText[20];
- private float []carray=new float[20];
- private MyImage?sv;
- @Override
- public void onCreate(Bundle?savedInstanceState)?{
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- change=(Button)findViewById(R.id.set);
- sv=(MyImage)findViewById(R.id.MyImage);
- for(int i=0;i<20;i++){
- et[i]=(EditText)findViewById(R.id.indexa+i);
- carray[i]=Float.valueOf(et[i].getText().toString());
- }
- change.setOnClickListener(l);
- }
- private Button.OnClickListener?l=new Button.OnClickListener(){
- @Override
- public void onClick(View?arg0)?{
- //?TODO?Auto-generated?method?stub
- getValues();
- sv.setValues(carray);
- sv.invalidate();
- }
- };
- public void getValues(){
- for(int i=0;i<20;i++){
- carray[i]=Float.valueOf(et[i].getText().toString());
- }
- }
- }
- MyImage类继承自View类:
- public class MyImage extends View?{
- private Paint?mPaint?= new Paint(Paint.ANTI_ALIAS_FLAG);
- private Bitmap?mBitmap;
- private float []?array=new float[20];
- private float mAngle;
- public MyImage(Context?context,AttributeSet?attrs)?{
- super(context,attrs);
- mBitmap????=?BitmapFactory.decodeResource(context.getResources(),
- R.drawable.test);
- invalidate();
- }
- public void setValues(float []?a){
- for(int i=0;i<20;i++){
- array[i]=a[i];
- }
- }
- @Override protected void onDraw(Canvas?canvas)?{
- Paint?paint?=?mPaint;
- paint.setColorFilter(null);
- canvas.drawBitmap(mBitmap,?0, 0,?paint);
- ColorMatrix?cm?=?new ColorMatrix();
- //设置颜色矩阵
- cm.set(array);
- //颜色滤镜,将颜色矩阵应用于图片
- paint.setColorFilter(new ColorMatrixColorFilter(cm));
- //绘图
- canvas.drawBitmap(mBitmap,?0, 0,?paint);
- Log.i(“CMatrix”, “———>onDraw”);
- }
- }?
- CooMatrix 类:
- public class CooMatrix extends Activity?{
- private Button?change;
- private EditText?[]?et=new EditText[9];
- private float []carray=new float[9];
- private MyImage?sv;
- /**?Called?when?the?activity?is?first?created.?*/
- @Override
- public void onCreate(Bundle?savedInstanceState)?{
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- change=(Button)findViewById(R.id.set);
- sv=(MyImage)findViewById(R.id.MyImage);
- for(int i=0;i<9;i++){
- et[i]=(EditText)findViewById(R.id.indexa+i);
- carray[i]=Float.valueOf(et[i].getText().toString());
- }
- change.setOnClickListener(l);
- }
- private Button.OnClickListener?l=new Button.OnClickListener(){
- @Override
- public void onClick(View?arg0)?{
- //?TODO?Auto-generated?method?stub
- getValues();
- sv.setValues(carray);
- sv.invalidate();
- }
- };
- public void getValues(){
- for(int i=0;i<9;i++){
- carray[i]=Float.valueOf(et[i].getText().toString());
- }
- }
- }
- MyImage类继承自View类:
- public class MyImage extends View?{
- private Paint?mPaint?= new Paint(Paint.ANTI_ALIAS_FLAG);
- private Bitmap?mBitmap;
- private float []?array=new float[9];
- public MyImage(Context?context,AttributeSet?attrs)?{
- super(context,attrs);
- mBitmap?=?BitmapFactory.decodeResource(context.getResources(),
- R.drawable.ic_launcher_android);
- invalidate();
- }
- public void setValues(float []?a){
- for(int i=0;i<9;i++){
- array[i]=a[i];
- }
- }
- @Override protected void onDraw(Canvas?canvas)?{
- Paint?paint?=?mPaint;
- canvas.drawBitmap(mBitmap,?0, 0,?paint);
- //new?一个坐标变换矩阵
- Matrix?cm?=?new Matrix();
- //为坐标变换矩阵设置响应的值
- cm.setValues(array);
- //按照坐标变换矩阵的描述绘图
- canvas.drawBitmap(mBitmap,?cm,?paint);
- Log.i(“CMatrix”, “———>onDraw”);
- }
- }?
从上图标示出的坐标看出原图的(32,32)映射到原图的(32,32),(64,32)映射到原图(64,48)这样的效果是图像放大了而且 发生了旋转。这样的过程相当于(32,32)点不动,然后拉住图形(64,32)点并拉到(64,48)点处,这样图形必然会被拉伸放大并且发生旋转。最 后用一个平移将图形移动到右边现在的位置。希望能够好好理解这一过程,下面的3,4图是同样的道理。Matrix还有许多类似的Map方法可以做出许多效 果。详细可以参考Matrix类下的方法。