代码记录——phase16,block36
36*36
-2,-2扩展
代码有问题,有时能运行有时报错。
HRESULT RotateZoom(PBYTE pbSrc,int iWidth,int iHeight,double dbRotate,double dbZoom,PBYTE pbTag)
{
//int phase[17]={0};//8相位,包含端点存在17个距离 //16
//for (int i=0;i<17;i++)
//{
// double i2=1.0*i;
// phase[i]=fs(i2/8)*1024;
//}
int phase[]={,,,,,,,,,-,-,-,-,-,-,-,}; int src1x,src1y,src2x,src2y,src3x,src3y,src4x,src4y;
int drcx[],drcy[];
int angl=;//旋转45度
int middle_height=;
int middle_width=;
int rx=;
int ry=; int newheight=;
int newwidth=;
int rx0=; //插值放大后图像的旋转中心
int ry0=;
for(int y=;y<;y=y+)
{
for(int x=;x<;x=x+)
{
//正向映射入大图像中分块图像所对应的像素点
src1x=x;src1y=y;src2x=x+;src2y=y;src3x=x;src3y=y+;src4x=x+;src4y=y+;
//正向映射公式
int a=dbZoom;
drcx[]=(a*src1x-rx)*angl+(a*src1y-ry)*angl+rx0*;
drcy[]=-(a*src1x-rx)*angl+(a*src1y-ry)*angl+ry0*;
drcx[]=(a*src2x-rx)*angl+(a*src2y-ry)*angl+rx0*;
drcy[]=-(a*src2x-rx)*angl+(a*src2y-ry)*angl+ry0*;
drcx[]=(a*src3x-rx)*angl+(a*src3y-ry)*angl+rx0*;
drcy[]=-(a*src3x-rx)*angl+(a*src3y-ry)*angl+ry0*;
drcx[]=(a*src4x-rx)*angl+(a*src4y-ry)*angl+rx0*;
drcy[]=-(a*src4x-rx)*angl+(a*src4y-ry)*angl+ry0*;
//获得分块图像大范围
drcx[]=(int)(drcx[]/);//截后10位处理?
drcy[]=(int)(drcy[]/);
drcx[]=(int)(drcx[]/);
drcy[]=(int)(drcy[]/);
drcx[]=(int)(drcx[]/);
drcy[]=(int)(drcy[]/);
drcx[]=(int)(drcx[]/);
drcy[]=(int)(drcy[]/);
//放大二倍有边框,不旋转时+1可处理
int max_x,max_y,min_x,min_y;
int srcx,srcy;
max_x=drcx[];max_y=drcy[];min_x=drcx[];min_y=drcy[];
for (int i=;i<;i++)
{
if (min_x>drcx[i])
min_x=drcx[i];
if (min_y>drcy[i])
min_y=drcy[i];
}
min_x=min_x-;min_y=min_y-;
for (int i=;i<;i++)
{
if (max_x<drcx[i])
max_x=drcx[i];
if (max_y<drcy[i])
max_y=drcy[i];
}
max_x=min_x+-;max_y=max_y+; //将范围内的点映射回原图中 同时旋转插值
for (int j=min_y;j<=max_y;j++)
{
for (int i=min_x;i<=max_x;i++)
{
//将点映射回原图中
srcx=((i-rx0)*angl-(j-ry0)*angl+rx*)/;
srcy=((i-rx0)*angl+(j-ry0)*angl+ry*)/;
if ((srcx>=x-)&&(srcx<=x+)&&(srcy>=y-)&&(srcy<=y+)&&(srcx>=)&&(srcy>=)&&(srcx<=iWidth-)&&(srcy<=iHeight-))/*&&(i>=0)&&(j>=0)*/
{
//映射后位置判断区别可能有误
//if(srcx>x+31)
//{
// srcx=x+31;
//}
//if(srcy>y+31)
//{
// srcy=y+31;
//} //if(srcx<x-1)
//{
// srcx=x-1;
//}
//if(srcy<y-1)
//{
// srcy=y-1;
//} //插值:
//计算整数部分和小数部分
int xOr = floor((double)srcx);
int yOr = floor((double)srcy);
double u=srcx-xOr;
double v=srcy-yOr;
//查表双三插值
int phasex=*u;//8相位
int phasey=*v;
int A1,B1,C1,D1,A2,B2,C2,D2; //计算每个点的插值系数
A1=phase[+phasex];B1=phase[phasex];C1=phase[-phasex];D1=phase[-phasex];
A2=phase[+phasey];B2=phase[phasey];C2=phase[-phasey];D2=phase[-phasey]; //由src计算块编号,使用对应编号块内的相对位置
int xnum,ynum;
int x_upleft,y_upleft;//左上起始点坐标
int x_shift,y_shift; xnum=floor(srcx/32.0)+;
ynum=floor(srcy/32.0)+;
x_upleft=(xnum-)*;
y_upleft=(ynum-)*; int imgsrc[]={};//36*36=1296,32*32
int ijk=;
//存入分块
for (int n=;n<;n++)
{
for (int m=;m<;m++)
{
imgsrc[ijk]=pbSrc[(y_upleft-+n)*iWidth+x_upleft-+m];
ijk++;
} }
//块内相对偏移位置,u和v代表的相位偏移量不用变
x_shift= xOr-x_upleft+;
y_shift= yOr-y_upleft+; int middle=imgsrc[(y_shift)*+(x_shift)]; /*imgsrc[(yOr-1)*iWidth+(xOr-1)]*A1*A2+imgsrc[(yOr)*iWidth+(xOr-1)]*A1*B2+imgsrc[(yOr+1)*iWidth+(xOr-1)]*A1*C2+imgsrc[(yOr+2)*iWidth+(xOr-1)]*A1*D2+
imgsrc[(yOr-1)*iWidth+(xOr)]*B1*A2+imgsrc[(yOr)*iWidth+(xOr)]*B1*B2+imgsrc[(yOr+1)*iWidth+(xOr)]*B1*C2+imgsrc[(yOr+2)*iWidth+(xOr)]*B1*D2+
imgsrc[(yOr-1)*iWidth+(xOr+1)]*C1*A2+imgsrc[(yOr)*iWidth+(xOr+1)]*C1*B2+imgsrc[(yOr+1)*iWidth+(xOr+1)]*C1*C2+imgsrc[(yOr+2)*iWidth+(xOr+1)]*C1*D2+
imgsrc[(yOr-1)*iWidth+(xOr+2)]*D1*A2+imgsrc[(yOr)*iWidth+(xOr+2)]*D1*B2+imgsrc[(yOr+1)*iWidth+(xOr+2)]*D1*C2+imgsrc[(yOr+2)*iWidth+(xOr+2)]*D1*D2;*/ /*int middle=pbSrc[(yOr-1)*iWidth+(xOr-1)]*A1*A2+pbSrc[(yOr)*iWidth+(xOr-1)]*A1*B2+pbSrc[(yOr+1)*iWidth+(xOr-1)]*A1*C2+pbSrc[(yOr+2)*iWidth+(xOr-1)]*A1*D2+
pbSrc[(yOr-1)*iWidth+(xOr)]*B1*A2+pbSrc[(yOr)*iWidth+(xOr)]*B1*B2+pbSrc[(yOr+1)*iWidth+(xOr)]*B1*C2+pbSrc[(yOr+2)*iWidth+(xOr)]*B1*D2+
pbSrc[(yOr-1)*iWidth+(xOr+1)]*C1*A2+pbSrc[(yOr)*iWidth+(xOr+1)]*C1*B2+pbSrc[(yOr+1)*iWidth+(xOr+1)]*C1*C2+pbSrc[(yOr+2)*iWidth+(xOr+1)]*C1*D2+
pbSrc[(yOr-1)*iWidth+(xOr+2)]*D1*A2+pbSrc[(yOr)*iWidth+(xOr+2)]*D1*B2+pbSrc[(yOr+1)*iWidth+(xOr+2)]*D1*C2+pbSrc[(yOr+2)*iWidth+(xOr+2)]*D1*D2;
*/
//middle=middle/(1024*1024); if(middle<=&&middle>=)
pbTag[j*newwidth+i]=middle;
else if(middle>)
pbTag[j*newwidth+i]=;
else
pbTag[j*newwidth+i]=;
}
}
}
}
}
return ERROR_SUCCESS;
}
代码记录——phase16,block36的更多相关文章
- 代码记录——phase16,block36(修正后)
加入边缘判定,<2则加2. if (x_upleft<2) x_upleft=x_upleft+2; if (y_upleft<2) y_upleft=y_upleft+2; HRE ...
- 代码记录——phase16,block32
HRESULT RotateZoom(PBYTE pbSrc,int iWidth,int iHeight,double dbRotate,double dbZoom,PBYTE pbTag) { / ...
- MVVM 代码记录
一.XML <Page x:Class="MVVM.MainPage" xmlns="http://schemas.microsoft.com/winfx/20 ...
- Echarts基于动态数据初步使用 及问题 代码记录.
ECHARTS 插件 基本的动态数据展示(横向图) 下载 echarts.commn.min.js文件 在页面中进行引用, 并为Echarts图形准备一个div盒子 <!-- 引入插件 --&g ...
- OpenCV学习代码记录——人脸检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录—— Snake轮廓
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录——Hough线段检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录——轮廓(contour)检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录——canny边缘检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
随机推荐
- 关于C#单例Singleton的看法和使用
首先明白一点,什么是单例模式? 单例模式是指一个类在一个应用程序运行时仅仅实例化一次,以后所有的调用都使用第一次实例化的对象,是应用程序级别的,与session,用户等无关,它比全局参数或静态类方式更 ...
- IDEA隐藏.idea文件夹
打开setting,Editor-->File Types.在Ignore files and folders中添加“.idea;”
- PinnedListView分析一
分享一个Android控件,PinnedHeaderListView , 大致是像图钉一样,能够固定显示一个头部在ListView的顶部,类似于Android原版通讯录中联系人按照字母分组排列, 这个 ...
- java不确定参数个数方法例子
package test; public class myTest { // 根据输入的参数动态生成数组 public static int max(int... param) { int max = ...
- 关于Unity中粒子效果的使用
粒子效果1: 游戏中会有很炫酷的特效,比如爆炸,水花,火焰等;2: unity提供粒子编辑器,方便特效人员来开发很炫酷的特效;3.粒子效果一般有专门的粒子特效师来做,我们只需要拿来用就好了,很多参数没 ...
- C++复合类型(结构体)
其实c++的结构体可以理解为类似于python的字典,我个人理解, 但有区别 先看结构 #include <iostream> 关键字 标记成为新类型的名称 struct inflatab ...
- SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念: SpringBoot 错误处理 2.具体内容 在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会 ...
- SpringMVC系列(六)处理模型数据
Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据 Map 及 Model: ...
- Java如何以不同国家的格式显示时间?
在Java中,如何以不同国家的格式显示时间? 以下示例使用Locale类和DateFormat类来显示不同国家格式的日期. package com.yiibai; import java.text.D ...
- asp 读文件 比较ip
<% Dim UserIPAddress Set UserIPAddress = Request.ServerVariables("HTTP_X_FORWARDED_FOR" ...