问题

在将图像绘制到屏幕前你想对它进行旋转,缩放或镜像操作。

解决方案

SpriteBatch 类(见前一个教程)的Draw方法的不同重载可以让你很简单地进行上述操作。

工作原理
旋转/缩放/镜像一个图像

SpriteBatch.Draw方法有几个有用的重载。下面是最复杂的一个重载方法,参数会在后面加以讨论:

public void Draw (Texture2D texture,Vector2 position,Nullable<Rectangle> sourceRectangle,Color color,float rotation,Vector2 origin,Vector2 scale,SpriteEffects effects,float layerDepth)

前两个参数和第四个参数在上一个教程中已经讨论过了,它们可以指定在屏幕上绘制哪个纹理和图像的左上角相对于屏幕的位置。

参数sourceRectangle让你可以只绘制图像的一部分。如果你将多个图像存储在一张图像中,如教程3-3中所做,那么这个参数是很有用的。如果你只想显示整个图像,那么应将这个参数设为null。

旋转

使用rotation 参数你可以旋转一个图像。你需要使用弧度制指定这个旋转角度,所以如果你想让图像顺时针旋转20度,你可以使用MathHelper.ToRadians(20),它可以帮你完成这个转换。

注意:2*PI弧度对应360角度,PI弧度对应180角度。所以如果你想旋转20度,你也可以使用MathHelper.Pi/180.0f*20.0f作为参数。

参数origin可以指定你想让图像上的哪个点位于屏幕上你在第二个参数中指定的位置上。例如,如果你将两个参数都指定为(0,0),那么图像的左上角将位于屏幕的左上角,如图3-2中的左上图所示。

图3-2 不同origin (偏移量)参数对应的情况

如果一张64 × 64大小的图像,你将屏幕位置指定为(0,0),origin指定为(32,32),那么图像的中心点将位于屏幕的左上角,如图3-2的中上图所示。

如果两个参数都是(32,32),那么图像的中心点将位于屏幕的(32,32)位置,如图3-2的右上图所示。这时的结果与左上图一样。

更重要的是,你指定的这个origin参数还将作为旋转的中心点。在左上图的情况中,(0,0)为图像的origin,这个图像会围绕这个点旋转,如图3-2中的左下图所示。如果你指定(32,32)为图像的origin,这个图像会围绕它的中心点旋转,如图3-2的右下图所示。

缩放

如果你想放大/缩小图像,可以设置参数scale。因为这个参数是一个Vector2,你可以对图像的水平方向和竖直方向施加不同的缩放值。例如,设置为(0.5f, 2.0f)将会使宽度变为原始宽度的一半,高度变为原始高度的2倍。

镜像

参数effects让你可以水平或竖直翻转图像。通过flags,你可以使用SpriteEffects.FlipHorizontally|SpriteEffects.FlipVertically同时进行这两个操作,这和将图像旋转180度的效果是相同的。

层深度

最后一个参数让你可以指定图像位于哪个层,当你想将多个图像在各自的顶部时层的概念是很有用的,这会在后面两个教程中详细介绍。

代码

下面的简单代码使用了所有的默认effects:

protected override void Draw(GameTime gameTime)
{device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.CornflowerBlue, 1, 0); spriteBatch.Begin(); spriteBatch.Draw(myTexture, new Vector2(50, 100), null, Color.White, MathHelper.ToRadians(20), new Vector2(32, 32), new Vector2(0.5f, 2.0f), SpriteEffects.FlipVertically, 0); spriteBatch.End(); base.Draw(gameTime);
}

这两个教程中涵盖的内容让你可以制作一些基本的2D游戏。你可以到我的网站www.riemers.net中XNA教程中的2D系列,里面有一个完整的2D游戏。

转载于:https://www.cnblogs.com/AlexCheng/archive/2010/11/16/2120159.html

处理2D图像和纹理——旋转,缩放和镜像一张图像相关推荐

  1. Python实现图像平移、旋转、水平镜像等

    一.图像平移 二.图像水平镜像 三.图像垂直镜像 四.图像缩放 五.图像旋转 Python代码实现: import cv2 import math import numpy as npclass Im ...

  2. 输电线路杆塔、导线分割图像数据集(含分割标签,1242张图像),输电线路巡检图像数据

    图像数据集概况: 分割标签: 下载地址:输电线路杆塔.导线分割图像数据集

  3. 图像算法研究---索引图像旋转缩放锯齿问题

    所谓索引图像 ,就是一种把像素值直接作为RGB调色板下标的图像,把像素值直接映射成调色板中的数值.索引图像最多只包含256种颜色,这256中颜色分别对应0-255个值,也就是256种索引值,一般的真彩 ...

  4. python统计图片的纹理信息_python实现LBP方法提取图像纹理特征实现分类

    题目描述 这篇博文是数字图像处理的大作业. 题目描述:给定40张不同风格的纹理图片,大小为512*512,要求将每张图片分为大小相同的9块,利用其中的5块作为训练集,剩余的4块作为测试集,构建适当的模 ...

  5. 【图像配准】基于粒子群改进的sift图像配准matlab源码

    SIFT \ SIFT尺度不变特征转换,具有选择,尺度不变性.由David Lowe在1999年所发表,2004年完善总结. owe将SIFT算法分解为如下四步: \ 1. 尺度空间极值检测:搜索所有 ...

  6. python如何移动图片_python之详细图像仿射变换讲解(图像平移、旋转、缩放、翻转),一文就够了,赶紧码住...

    仿射变换简介 什么是放射变换 图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方. 从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向 ...

  7. 处理2D图像和纹理——投影纹理

    创建一面镜子:投影纹理 问题 你想在场景中创建一面镜子.例如,在一个赛车游戏中创建一面后视镜.你也可以使用这个技术创建一个反射贴图. 解决方案 首先需要将镜子中看到的场景绘制到一张纹理中.然后,绘制相 ...

  8. 图像中的一条直线在旋转缩放过程中会有分段现象,或产生分段节点

    图像中的一条直线在旋转缩放过程中会有分段现象. 图像在Windows照片查看器中打开.显示. 使用滚轮放大缩小. 原来的一条直线会分段. 图像旋转方式:16相位(33端).32 原图: 经旋转45,放 ...

  9. 【数字图像处理】实验一 图像的平移,缩放和旋转(vs2017+opencv)

    文章目录 一. 平移 1.思路 2.实现代码 二.缩放 1.思路 2.代码实现 三.旋转变换 1.思路 对文章内容如有异议欢迎在评论区提问 代码包: 数字图像平移.旋转.缩放 一. 平移 1.思路 新 ...

  10. MATLAB图像平移、旋转、缩放、裁剪

    版本: MATLAB R2019a 目录 (一)图像平移 (二)图像旋转 1.图像尺寸不变 2.图像信息不丢失 (三)图像缩放 (四)图像裁剪 (一)图像平移 使用MATLAB自带函数 transla ...

最新文章

  1. (0055)iOS开发之dealloc认识
  2. java ltpa_LTPA Cookie原理
  3. Web安全之命令执行漏洞
  4. C# 深入浅出 委托与事件
  5. C#中使用JavaScriptSerializer类实现序列化与反序列化
  6. 2015-12-15 关于数量个
  7. DB2 SQL性能调优秘笈pdf
  8. xfs支持oracle,让linux内核支持xfs文件系统
  9. Python | threading02 - 互斥锁解决多个线程之间随机调度,造成“线程不安全”的问题。
  10. 进大学时高考成绩是班里第一,同样也是努力学习,为什么大学时做不到第一了呢?
  11. android开发图片格式,Android程序开发如何处理图像格式类及图像转换
  12. ASCII、Unicode、GBK和UTF-8字符编码的区别联系(转载)
  13. 第一周练习代码以及备注
  14. vue 音频文件打包后找不到文件
  15. mysql error 1114_ERROR 1114 (HY000): The table 'test1' is full 的解决
  16. Wireshark入门-Wireshark
  17. 一文通俗入门·脉冲神经网络(SNN)·第三代神经网络
  18. android 应用图标替换后手机安装还显示旧的图标或者显示android小人人
  19. -- 6、查询“李“姓老师的数量
  20. Google被封事件真相

热门文章

  1. RoundedUITableView
  2. 服务器设计笔记(1)-----消息的封装
  3. 装CGAL与解决QWidget: Must construct a QApplication before a QPaintDevice. 问题
  4. 文强+光裕+唐骏,告诉我们什么?
  5. pcb布线拐角处打地孔_嵌入式开发必看: PCB设计的这几个问题,你能明白了吗?...
  6. 云痕大数据 家长登录_智学网家长学生查分入口:www.zhixue.com
  7. c语言+游戏破解,c语言获得键盘的按键
  8. 数据库与表的操作之创建表(CREATE TABLE)
  9. 使用util.js处理表格
  10. 【渝粤题库】 陕西师范大学 210021 学前儿童健康教育 作业(专升本)