代码记录——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 ...
随机推荐
- 建立window SVN服务器
在windows下搭建SVN服务器: 首先从http://www.visualsvn.com/server/download/ 下载最新的VisualSVN-Server-x.x.x.msi,然后本机 ...
- python学习笔记十四:wxPython Demo
一.简介 wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets ...
- C#中的装箱拆箱
在C#中,经常需要把值类型和引用类型相互转换. 首先明确两条法则: 1.引用类型总是被分配到“堆”上. 2.值类型总是分配到它声明的地方: a.作为引用类型的成员变量分配到“堆”上 b.作为方法的局部 ...
- Java编程的逻辑 (74) - 并发容器 - ConcurrentHashMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- WIN7或者WIN8上边框的异常问题的解决攻略
//主要两个步骤://第一个步骤就是在CMainFrame::OnCreate里面增加 HINSTANCE hInst = LoadLibrary(_T("UxTheme.dll" ...
- 处理异常json串的jar包JsonSerde
参考下面文章: https://blog.csdn.net/SunnyYoona/article/details/70170173
- JS监听页面----无鼠标键盘动作,自动跳页
function ScreenSaver(settings){ this.settings = settings; this.nTimeout = this.settings.timeout; doc ...
- PCL点云分割(1)
点云分割是根据空间,几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提,例如逆向工作,CAD领域对零件的不同扫描表面进行分割,然后才能更好的进行空洞 ...
- Javascript动态操作CSS总结
一.使用js操作css属性的写法 1.对于没有中划线的css属性一般直接使用style.属性名即可. 如:obj.style.margin,obj.style.width,obj.style.left ...
- mysql流程函数if之类
表名: salary ———————— userid | salary| ———————— 1 | 1000 2 | 2000 3 | 3000 4 | null ... IF(value, t, f ...