transform & Matrix & colorTransform

本文介绍了如何使用Flash中的ColorTransform和Matrix类来改变显示对象的颜色和坐标。通过具体实例展示了ColorTransform类如何调整颜色参数,以及Matrix类如何通过缩放、旋转和平移等操作来变换坐标。

transform 类 使用Matrix或者colortransform属性对 显示对象进行坐标或颜色转换;

 

  • transform和colortransform类

  构造函数:ColorTransform(redMultiplier:Number = 1.0, greenMultiplier:Number = 1.0, blueMultiplier:Number = 1.0, alphaMultiplier:Number = 1.0, redOffset:Number = 0, greenOffset:Number = 0, blueOffset:Number = 0, alphaOffset:Number = 0);

新红色值 = (旧红色值 * redMultiplier) + redOffset

新绿色值 = (旧绿色值 * greenMultiplier) + greenOffset

新蓝色值 = (旧蓝色值 * blueMultiplier) + blueOffset

新 Alpha 值 = (旧 Alpha 值 * alphaMultiplier) + alphaOffset

测试代码:

package { import flash.display.Sprite; import flash.display.MovieClip; import flash.events.MouseEvent; import flash.geom.Transform; import flash.geom.ColorTransform; public class ColorTransformExample extends Sprite{ private var _MC:Sprite; function ColorTransformExample(){ init(); } private function init(){ _MC=new Sprite(); _MC.graphics.beginFill(0xFF0000,1); _MC.graphics.drawRect(0, 0, 100, 100); _MC.graphics.endFill(); _MC.addEventListener(MouseEvent.CLICK,transformColor); addChild(_MC); } private function transformColor(event:MouseEvent){ var rOffset:Number = _MC.transform.colorTransform.redOffset + 25; var bOffset:Number = _MC.transform.colorTransform.redOffset - 25; _MC.transform.colorTransform=new ColorTransform(1,1,1,1,rOffset,0,bOffset,0);  trace (_MC.transform.colorTransform.toString()); }

//注意下述错误使用方式,容易进入这个误区,要为colortransform提供不同的参数;

//private function transformColor(e:MouseEvent){ // _MC.transform.colorTransform=new ColorTransform(1,1,1,1,-25,0,25,0); // } }

 

  • transform和Matrix类

Matrix矩阵图如下,一般使用上面两行:

以上的每个字母都有各自的运用意义,分别是:
  a = 控制 X 的宽度
  b = 控制 Y 的倾斜
  c = 控制 X 的倾斜
  d = 控制 Y 的高度
  tx = 控制 X 坐标位置
  ty = 控制 Y 坐标位置

转换后的x,y计算公式:

X’ = a*X + c*Y + tx;
  Y’ = b*X + d*Y + ty;

 

Matrix中还有几个基本函数可以控制,所以也可以不用一直重新定义Matrix类,那就是
  Matrix.scale(a,d);
  Matrix.translate(tx1, ty2); //这里的tx1和ty1是所要递增或递减原有tx和ty的数值
  Matrix.rotate(弧度); //弧度就是 (角度/ 180)* Math.PI

 

测试代码如下:

 

 

package {

import flash.display.Sprite;

import flash.display.MovieClip;

import flash.events.MouseEvent;

   import flash.geom.Transform;

   import flash.geom.ColorTransform;

   import flash.geom.Matrix;

 

   public class ColorTransformExample extends Sprite{

     private var _MC:Sprite;

 

function ColorTransformExample(){

init();

}

private function init(){

_MC=new Sprite();

_MC.graphics.beginFill(0xFF0000,1);

_MC.graphics.drawRect(0, 0, 100, 100);

_MC.graphics.endFill();

_MC.addEventListener(MouseEvent.CLICK,transformMatrix);

addChild(_MC);

}

private function transformMatrix(event:MouseEvent){

var aOffset:Number = _MC.transform.matrix.a + 0.05;

            var bOffset:Number = _MC.transform.matrix.d + 0.05;

 

_MC.transform.matrix=new Matrix(aOffset,bOffset,0,1,100,100);   //和上面一样的道理,必须给Matrix更新参数,而matrix比colorTransform方便,因为有函数自动实现这个递增,只需提供递增量给函数

//var tempMatrix=_MC.transform.matrix;

// tempMatrix.scale(aOffset,bOffset);

// _MC.transform.matrix=tempMatrix;

//var tempMatrix=_MC.transform.matrix;

// tempMatrix.rotate(0.5);

// _MC.transform.matrix=tempMatrix;

//var tempMatrix=_MC.transform.matrix;

// tempMatrix.translate(5,5);

// _MC.transform.matrix=tempMatrix;

}

 

}

}    

 

 

ps:Matrix还用于

 

  • BitmapData 对象的 draw() 方法
  • Graphics 对象的 beginBitmapFill() 方法、beginGradientFill() 方法或 lineGradientStyle() 方法

 

 

private void applyCameraParameters(CaptureRequest.Builder finalPreviewBuilder) { try { // 转换调节值到实际范围(示例:亮度0-100映射到0.0-1.0) //float brightnessValue = brightness / 100f; float contrastValue = (contrast / 50f); // 示例:对比度0-100映射到0.0-2.0 float greyValue = grey / 100f; // 亮度调节参数(假设brightness范围0-100,映射到-1.0~1.0) float brightnessValue = (brightness - 50) / 50f; // 0对应中间值,-1为最暗,1为最亮 float scale = 1 + brightnessValue * 0.5f; // 缩放系数(根据需求调整) float offset = brightnessValue * 0.5f; // 偏移量(根据需求调整) ColorMatrix colorMatrix = new ColorMatrix(new float[] { scale, 0, 0, 0, offset, 0, scale, 0, 0, offset, 0, 0, scale, 0, offset, 0, 0, 0, 1, 0 }); //colorMatrix.setSaturation(1 - greyValue); // 灰度调节(0为完全灰度,1为原色) colorMatrix.setScale(brightnessValue, brightnessValue, brightnessValue, brightnessValue); // 亮度调节 // 对比度调节需自定义矩阵(此处简化) // 更新预览请求 finalPreviewBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CameraMetadata.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX); /* // 示例:对比度增强矩阵(需根据实际算法调整系数) float[] contrastMatrix = { contrastValue, 0f, 0f, 0f, contrastValue, 0f, 0f, 0f, contrastValue }; // 转换为有理数数组 int[] rationalMatrixData = new int[9 * 2]; for (int i = 0; i < 9; i++) { rationalMatrixData[i * 2] = (int) (contrastMatrix[i] * 1000); rationalMatrixData[i * 2 + 1] = 1000; } ColorSpaceTransform colorTransform = new ColorSpaceTransform(rationalMatrixData); previewBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, colorTransform); */ 这个亮度调节没有效果
03-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值