还是普通二维图形处理(向量,点阵图旋转)

c#下的简单2D图像处理这个本来也是没什么可说的 我本人也不做图像处理方面的正经工作。一天为了工作 浑浑噩噩 写数据平台下的业务代码 ,其实这些东西大都用不怎么上。 出了校门这么久了 高中的那些sin cos 向量 是干嘛的 怎么都用不上。 做图像处理发现 哇 都用上了 原来数学这么有趣 甚至还会用上一些大学的数学知识。在数学的世界里 会发现计算机程序语言仅仅是工具 而已。你在C++ java下 也是一样的 算法都是一样 。 首先说下我要讲的也没什么技术含量。其实这些东西在大多数图像库里都自带了。这里只是想简明提一下他的原理 能够做什么 ,如果库里没有自带呢 如果在那种刀耕火种的嵌入式设备平台下编代码呢 就是考验你的时候到了噻。 不过在windows平台下 成熟的大平台下 这种考验你的机会不大可能。成熟的大平台下软件开发 各种外部可供调用的东西一坨一坨的 就是写业务代码 也没什么技术含量的。我写的东西 基本开篇都要bb一番的 虽然也没啥本事 ,别拍砖。好正题 。

向量计算及其运用

 1 //向量的声明:
 2 //向量和点 虽然都用坐标的方式表示 ,但是它们意义有本质的区别
 3 //向量和点 在c#可以强制互相转换
 4 //(WPF 里用Vector WPF里有很多原来winform模式下重复功能的库,WPF也在重复造轮子
 5 Vector v1 = (Vector)new System.Windows.Point(1, 0);
 6 Vector v2 = (Vector)new System.Windows.Point(0, 1);
 7
 8 System.Windows.Point p1 = (System.Windows.Point)new Vector(1, 0);
 9
10
11 //向量的运算:
12 //基本方式是x+x  y+y 不用多说噻
13 //其实两个向量相加并没有明确的几何意义 ,点和向量相加 代表一个点移动到另一个点
14 //高中学过 两个向量相加是一个新的向量
15 //vector 重载了+ 运算符 所以 向量向量之间  点和向量之间均可进行运算,就像高中数学里那样
16 //向量的值v3为(1,1) 是不是跟高中学的一样;
17 Vector v3 = v1 + v2;
18 MessageBox.Show(string.Format("x={0},y={1}", v3.X, v3.Y));
19 //减去一个向量等于加上一个方向相反的向量  这里输出的值v4为(0.5,0.5)
20 Vector v4 = v3 - new Vector(0.5, 0.5);
21 MessageBox.Show(string.Format("x={0},y={1}", v4.X, v4.Y));
22
23
24 //利用向量你能够做什么:
25 //高中数学里的有一章 记得么 ,利用向量运算 检测两条直线是否平行 是否垂直 。
26 //三维空间法线计算  你都可以利用此原理
27 //我想 在游戏里 工程计算 这些地方都会用到 发挥你的想象力

用的图 是WPF自学手册里面的 然后是Vector这个东西只有WPF里才有 ,当然你用point自己实现也可以。

然后是 ,点阵图片的旋转:

这个理解稍微复杂点,还是先上图

这种东西我纯口水话描述 讲出来也不一定能达到效果。

具体理论充分利用了三角函数 r是坐标(0,0) 到具体点的半径。

首先看r*sin(阿尔法+西塔) 这里(阿尔法+西塔) 正是那个大的角的角度。

sin(阿尔法+西塔)为 对边/r  ,如果再乘以r  那么不正好等于对边的长度么 ,即点的Y值。

这里的sin(阿尔法+西塔) 就需要 利用 三角函数的和角公式 sin(A+B) = sinAcosB+cosAsinB。

当然其实不用也可以 ,别打我。

还需要用到Asin 函数 同是三角函数里的  根据正弦值 反向求角度。反正只要得到图中几个参数照公式套就可以了。

通过此类种种手段 就可以把图片所有旋转后的点求出来达到旋转图片的目的。

其实图上已经给出来了,然后对每个点依次计算 就可以了。

 1 void rotate()
 2 {
 3     //旋转
 4
 5     /*
 6      * 矩阵信息
 7      * cos&     sin&
 8      * -sin&    cos&
 9      */
10     System.Drawing.Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile("Tulips.jpg");
11
12     System.Drawing.Bitmap bmp2 = new Bitmap((int)(bmp.Width ), (int)(bmp.Height ));
13
14     for (int i = 0; i < bmp.Height; i++)//row
15     {
16         for (int j = 0; j < bmp.Width; j++)//col
17         {
18             //获取原始RGB
19             System.Drawing.Color sourceRGB = bmp.GetPixel(j, i);
20             //通过矩阵运算到新的坐标
21             double r = Math.Sqrt(Math.Pow(j, 2f) + Math.Pow(i, 2f));
22             double alpha = Math.Asin(i / r);
23             double xita = Math.PI / 6;
24
25             int x1 = (int)((r * Math.Cos(alpha) * Math.Cos(xita)) -
26                 (r * Math.Sin(alpha)) * (Math.Sin(xita)));
27
28             int y1 = (int)((r * Math.Sin(alpha) * Math.Cos(xita)) +
29                 (r * Math.Cos(alpha)) * (Math.Sin(xita)));
30
31             if ((x1 >= 0 && x1 < bmp2.Width) && (y1 >= 0 && y1 < bmp2.Height))
32                 bmp2.SetPixel(x1, y1, sourceRGB);
33         }
34     }
35
36     bmp2.Save("22.jpg", ImageFormat.Bmp);
37 }

这里的 xita是角度 double xita = Math.PI / 6;  代表30度 我们来看下成果:

位移跟拉伸 那些我想原理是太简单了我就不讲了。
祝大家周末愉快。

时间: 2024-10-15 19:26:06

还是普通二维图形处理(向量,点阵图旋转)的相关文章

js多张图片合成一张图,canvas(海报图,将二维码和背景图合并) -----vue

思路:vue中图片合并 首先准备好要合并的背景图,和请求后得到的二维码, canvas画图,将两张背景图和一张二维码用canvas画出来, 将canvas再转为img 注意canvas和图片的清晰图和图片的尺寸位置 开始时canvas是隐藏的,两张背景图时显示的,当canvas画完后再转为img的时候,隐藏canvas和背景图,显示canvas转完的图片(也就是合并后的图片) 这个适配方式可能有些瑕疵,所以会加了很多设备的判断 代码: html      <div class="wap-p

JAVA实现二维码生成加背景图

pom.xml依赖 <!-- 二维码生成 -->         <!-- https://mvnrepository.com/artifact/com.google.zxing/core -->         <dependency>             <groupId>com.google.zxing</groupId>             <artifactId>core</artifactId>   

一维码与二维码的用途与区别

条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符,分为一维码和二维码两种.一维码比较常用,如日常商品外包装上的条码就是一维码.它的信息存储量小,仅能存储一个代号,使用时通过这个代号调取计算机网络中的数据.二维码是近几年发展起来的,它能在有限的空间内存储更多的信息,包括文字.图象.指纹.签名等,并可脱离计算机使用.1.外观一维码:一维码是由纵向黑条和白条组成,黑白相间.而且条纹的粗细也不同,通常条纹下还会有英文字母或阿拉伯数字.二维码:二维

Java生成微信二维码及logo二维码

依赖jar包 QrCode.jar:https://pan.baidu.com/s/1c1PYV0s 加入本地 maven: mvn install:install-file -Dfile=QRCode.jar -DgroupId=QRCode -DartifactId=QRCode -Dversion=3.0 -Dpackaging=jar 实例源码 import com.swetake.util.Qrcode; import javax.imageio.ImageIO; import jav

二维图形旋转公式的推导

关于二维图形旋转可能在非常多计算机图形学相关的书籍上都会介绍,然而真正理解公式推导过程的却讲得不多. 那么怎样推导出二维图形绕某一点旋转的公式呢?我在这里就将其推导过程简要的说明一下. 事实上推导过程比較简单,首先我们来看一幅图,看看怎样推导出二维图形绕原点进行旋转的公式. 上图画的比較粗略,只是能说明问题就够了.如果旋转前的点位于P处.旋转之后的点位于P'处. 怎样求旋转之后的点P'坐标? 在图中.旋转之前P的方向角是a,旋转之后P'的方向角就变为a+b,这里b就是旋转的角度.所谓方向角是改点

[开源]C#二维码生成解析工具,可添加自定义Logo (转)

二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,中文等等.今天就来跟大家分享一下我的二维码生成解析工具,主要功能就是生成二维码,并且可以添加自定义的Logo.当然,网络上面生成二维码的工具多如牛毛,生成二维码早已不再新鲜.这个工具的一个亮点就是可以识别二维码,下面就来具体看看吧,不过首先要补充一点二维码的知识. 一.二维码基础知识 一.

[开源]C#二维码生成解析工具,可添加自定义Logo

二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,中文等等.今天就来跟大家分享一下我的二维码生成解析工具,主要功能就是生成二维码,并且可以添加自定义的Logo.当然,网络上面生成二维码的工具多如牛毛,生成二维码早已不再新鲜.这个工具的一个亮点就是可以识别二维码,下面就来具体看看吧,不过首先要补充一点二维码的知识.  一.二维码基础知识 一

Task 4.5 求二维数组中的最大连通子数组之和

任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最

一键生成二维码

工作中查资料偶然发现一个网站 自我感觉比bootstrap好用 贴上网址:http://www.pintuer.com/ 下载解压之后,可以看到这几个文件: 起步中有一个respond.js文件根据实际情况确定是否下载 插件中有一个生成二维码的插件,下载下来 解压后得到一个文件 新建HTML文件 将这些文件引入 引用顺序 jQuery.js在pintuer.js之前引用,如有自定义的CSS或JS,请在pintuer.css及pintuer.js之后引用,同时为了IE8下正常使用响应式,自定义的C