2D图像处理:斜切

原创 2006年06月07日 13:54:00

斜切在2D游戏中
使用过photoshop的人,大概都使用过“斜切”这种图形处理。斜切有什么用呢?在45度斜视角的游戏里,你有没有注意到城门上的字呢?它们就是使用了斜切。如果不使用斜切,字的视角和场景就会显得很不协调,看起来很别扭。斜切在2D的场景制作中是经常用到的功能。

斜切的算法
我们来看看photoshop是怎么实现斜切的吧。制作过程就不阐述了,

上图是制作后的效果。从图中可以知道,转换后的“日”字才会和背景黑板的视角一致,看起来才会真正融入到我们的游戏中,要不象第一幅一样,看起来很别扭。
我们留意一下,实际上两个“日”字的“竖”的长度都没变,“横”相对于竖的位置也没变。或许有些人说,这不是图象旋转吗?不是的,图象旋转的话,竖的长度会跟着变化。你看看和"Y"轴平行的那两"|""|",转换以后的长度都一样的。斜切和图象的旋转一样,都是属于图象的几何变换。

下面用伪代码给出实现。
//Bitmap是对bmp文件处理的一个类
//注意,该代码不能编译,只是给出实现算法
//参数bmp是源图,iAngle是斜切的角度,单位:度

#define PI 3.1415926535
#define RADIAN(angle) ((angle)*PI/180.0) //convert angle to radian
void Bitmap::BiasCut(const Bitmap& bmp,int iAngle)
{
 int iWidth    = bmp.GetW() ;  //源图的高度
 int iHeight    = bmp.GetH();   //源图的宽度
 float RotateAngle =(float)RADIAN(iAngle); //斜切的角度,就是黑板和X轴的交角,将角度转换为弧度
 double tga    = (double)tan( (double)RotateAngle  ); //tan,就是y/x的值
 DWORD dwNewW   = iWidth;                //转换后的图的宽度
 DWORD dwNewH   = (DWORD)(fabs( iWidth * tga ) + iHeight);//转换后的图的高度
 
 Create(  dwNewW, dwNewH );//创建转换后的的空白图 
 Clear( 0x0 );       //用黑色填充

 Pixel* line_src = bmp.GetPixel() ;//源图图象数据
 Pixel* line_des = GetPixel(); //转换后图象数据  

 DWORD x0,y0,x1,y1;
 for(y1=0;y1<dwNewH;y1++)
 {
  for(x1=0;x1<dwNewW;x1++)
  {
   x0 = x1;    //转换后的象素,x轴没变化
   y0 = y1-x1*tga;//转换后y轴的值,对应源图y轴的值

   if( (x0>=0) && (x0<(DWORD)iWidth) && (y0>=0) && (y0<(DWORD)iHeight))
   {
    line_des[y1][x1] = line_des[y0][x0];//第y1行第x1个象素点的象素 = 源图第y0行第x0个象素点的象素
   }    
  }
 }
}

其中,蓝色部分是算法的核心部分,相信大家都不难看懂。

初识 PS CS6(四)___斜切与扭曲

斜切与扭曲 先按Enter  选中图像,按Ctrl+T, 显示定界框,  再按Shift + Ctrl
  • aduovip
  • aduovip
  • 2014年09月29日 00:28
  • 1132

Java2D图像处理超简述

 处理流程是这样的,原始图像(BufferedImage)→BufferedImageOp→目标图像(BufferedImage)先来看下怎样从图片文件得到BufferedImage,和最后将其写入文...
  • HeLiang7
  • HeLiang7
  • 2007年08月08日 10:45
  • 2219

Android 斜切背景

来来来我们先看一个效果: 别的我们不关注呀,我们就看一下这个布局的背景,这个背景是斜切面的一个背景,如果要你去写这个布局你是不是得去到美工妹妹去作图呀。 现在我们不需要去找美工妹妹了(哎,少了一...
  • ZhangLei280
  • ZhangLei280
  • 2017年06月16日 18:00
  • 401

图像处理常用算法GPU实现一:图像二值化

本系列文章将使用GPU实现图像处理中常用的算法,此处只给出代码,关于算法原理描述有很多资料,大家可以自行查找。不足之处请大家不吝赐教,共同提高。 [cpp] view plain copy ...
  • u010607947
  • u010607947
  • 2017年08月14日 16:36
  • 215

Quartz2D 图像处理详解(一)

本文将为大家介绍常见的IOS图像处理操作包括以下四部分:旋转,缩放,裁剪以及像素和UIImage之间的转化,主要使用的知识是quartz2D。Quartz2D是CoreGraphics框架中的一个重要...
  • ffblog
  • ffblog
  • 2015年02月03日 17:20
  • 815

理解 Android 2D/3D 图形架构

首先理解 Android 的 egl
  • span76
  • span76
  • 2014年04月30日 13:06
  • 3948

Ejoy2D 开源(很简单的游戏图像引擎,利于追求极致物理文件大小)

相当简单,源码有的哟。(不过嘛,作者精力和多种手机平台上的一线经验不足,引擎的质量功能只能嘛嘛) Ejoy2D 开源 我们的第一个手游差不多做完了,预计在明年 1 月初推广,目前内测的...
  • love_hot_girl
  • love_hot_girl
  • 2014年02月27日 19:24
  • 1486

具有图片斜切功能的自定义控件

android 自定义控件继承自ImageView ,实现本地图片或网络图片斜切功能;
  • shanshan_1117
  • shanshan_1117
  • 2017年11月22日 15:28
  • 83

iOS斜切变换

CGAffineTransform CGAffineTransformMakeShear(CGFloat x, CGFloat y) {     CGAffineTransform transf...
  • majiakun1
  • majiakun1
  • 2017年11月08日 16:21
  • 62

2D图像处理框架-目录

准备写一个高效的2D图像处理框架,为体现高效,该框架能够:1。充分利用多核资源2。直接操作内存3。支持常见的图形格式 注意:本框架是基于Windows的C++实现,使用了OpenMP以提高多核性能,使...
  • igame
  • igame
  • 2008年10月10日 10:45
  • 632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2D图像处理:斜切
举报原因:
原因补充:

(最多只允许输入30个字)