javascript - 如何旋转(任意角度)ImageData 对象并接收新的“旋转”ImagData.data 数组
问题描述
我有一个 imageData 对象,其中包含以 rgba 编码的高程数据。我需要计算指定航向的高程剖面。对于一个像素宽度的线和北向上的标题,这很容易,因为它只是 imagaData 数组的一列。对于指定的度数,它也很容易,因为它涉及简单的三角函数来计算数组中的 x,y 位置,但是我的要求更复杂。事实上,我需要计算宽度大于 1 像素的条纹的高程剖面(最大值),因此我需要旋转整个图像数据。
简而言之,我需要:
1)裁剪图像以处理较小的数据(例如原始图像的中心一半) - 性能很重要
2) 将裁剪后的图像按中心旋转指定的度数,因此我将在表格中以向上的方向获取所需的高程数据。
3) 扫描高程剖面数据,按射线原始并计算每行的最大高程值。
由于此操作必须每秒计算多次,因此我需要优化的解决方案。我尝试使用画布上下文的转换/旋转,但是 imageData 对象没有改变,所以我想我需要将上下文图像(旋转)保存到另一个图像对象,但我不确定如何。
任何超过欢迎的提示
解决方案
我决定自己做数学,因为我只需要旋转图像的一部分。此函数以角度(以弧度为单位)围绕 (r) 顺时针旋转单点 (p)
function rotate(p, r, angle) // angle in radians, clockwise
{
var new_p = new Object();
// shortened calculation
new_p.x = Math.round(r.x + ((p.x - r.x)*Math.cos(angle) - (p.y - r.y)*Math.sin(angle)));
new_p.y = Math.round(r.y + ((p.x - r.x)*Math.sin(angle) + (p.y - r.y)*Math.cos(angle)));
return new_p;
}
测试,将 (0,0) 旋转 90 度
var test_p = rotate({ x:0, y:0 },{x:400,y:400},Math.PI/2)
结果
{x: 800, y: 0}
推荐阅读
- angular - 上传带有 Apollo-angular GraphQL 突变的文件
- android - 在 EditText 中关闭片段 onKeyListener
- mysql - 如何使用单行 SQL 查询批量删除 WordPress 的自定义帖子类型?
- c++ - C++ 中有没有办法通过指定列表中的每个成员变量来构造对象?
- excel - 查找具有特定值和返回位置的单元格
- powershell - 如何使用纠缠单元测试保存附件和标准输出?
- python - 用于原子访问的文件锁定不起作用
- pip - 如何在 Fedora 31 中将 PIP 与 Python 3.8 一起使用?
- node.js - KnexJS RangeError:超出最大调用堆栈大小
- c++ - 类的析构函数中的访问冲突读取位置