图像处理斜切原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在photoshop的图像变换中有斜切这个功能,可以将图像进行任意方向的缩放,并且还具有透视效果。我们要完全模拟这个功能现在几乎是不可能的。所以我们降低难度:不考虑透视,也不考虑斜方向的缩放。事实上,每个点进行移动也涉及大量函数,实现困难,但是与图像处理并不是很相关。我们主要领悟一下斜切浅层次的思想。其实他是图像缩放的一个升华。
那么下面我简单给出进行一个点移动的斜切方法
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import imgChange.*;
public class Cant extends Sprite
{
public function Cant()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
[Embed(source="死神.jpg")]
var LL:Class;Number
var srcBitmap:Bitmap = new LL() as Bitmap;
var percent:Number=0.6;
var destBitmap:Bitmap=cantProcess(srcBitmap,percent);
addChild(destBitmap);
}
//此方法为矩形ABCD,B点沿A点方向斜切,percent为移动的长度占宽度的百分比
public function cantProcess(srcBitmap:Bitmap,percent:Number):Bitmap
{
var srcData:BitmapData =srcBitmap.bitmapData;
var srcW:Number=srcBitmap.width;
var srcH:Number=srcBitmap.height;
var destBMP:Bitmap = null;
var destData:BitmapData = new BitmapData(srcW,srcH);
var tan:Number=srcW*percent/srcH;
for(var j:int=0;j { var destW:Number=srcW-(srcH-j-1)*tan; var MofdestW:int=int(destW+0.5);//destWm为destW的四舍五入的值 var NofdestW:Number=destW-int(destW);//destWn为的destW的小数部分 var scaleN:Number=srcW/MofdestW;//每行缩放的倍数 for(var i:int=0;i { var srcN:Number = (i+1)*scaleN; //获得目标像素点最接近的位置 var m:int = int(srcN); //m为源图像横坐标的整数部分 var u:Number = srcN-m; //p为源图像横坐标小数部分 //对两点运用插值算法 var aArray:Array = pixelProcess.retrieveRGBComponent(srcData.getPixel(m-1,j)); var bArray:Array = pixelProcess.retrieveRGBComponent(srcData.getPixel(m,j)); var r:Number = (1-u)*aArray[0]+u*bArray[0]; var g:Number = (1-u)*aArray[1]+u*bArray[1]; var b:Number = (1-u)*aArray[2]+u*bArray[2]; var colorArray:Array = new Array(r,g,b); // r,g,b合成颜色 var color:uint = pixelProcess.generateFromRGBComponent(colorArray); //设置目标图像某点的颜色 destData.setPixel(i,j,color); } if( NofdestW<0.5)//每行小于0.5的小数部分进行透明处理使图像边缘平滑 { var PofN:Number=(NofdestW+tan/2)*255;//按所占面积的百分比计算透明度 var color32:uint=PofN<<24|color; destData.setPixel32(i,j,color32);//填充32位像素值 } } destBMP = new Bitmap(destData); return destBMP; } } } 下面看下效果: 源图像: 斜切后: 让我们看下边缘的效果(放大10倍): 如果不进行这样的处理,边缘会看起来很粗糙。 这个算法只是提供了斜切的主要思想和如何进行边缘平滑处理的方法。 要做出完整的斜切效果还需要更深厚的数学基础。希望以后的同学可以将这个算法完善。