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,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++;
} }
//块内相对偏移位置
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,block32的更多相关文章

  1. 代码记录——phase16,block36

    36*36 -2,-2扩展 代码有问题,有时能运行有时报错. HRESULT RotateZoom(PBYTE pbSrc,int iWidth,int iHeight,double dbRotate ...

  2. 代码记录——phase16,block36(修正后)

    加入边缘判定,<2则加2. if (x_upleft<2) x_upleft=x_upleft+2; if (y_upleft<2) y_upleft=y_upleft+2; HRE ...

  3. MVVM 代码记录

      一.XML <Page x:Class="MVVM.MainPage" xmlns="http://schemas.microsoft.com/winfx/20 ...

  4. Echarts基于动态数据初步使用 及问题 代码记录.

    ECHARTS 插件 基本的动态数据展示(横向图) 下载 echarts.commn.min.js文件 在页面中进行引用, 并为Echarts图形准备一个div盒子 <!-- 引入插件 --&g ...

  5. OpenCV学习代码记录——人脸检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  6. OpenCV学习代码记录—— Snake轮廓

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  7. OpenCV学习代码记录——Hough线段检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  8. OpenCV学习代码记录——轮廓(contour)检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  9. OpenCV学习代码记录——canny边缘检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

随机推荐

  1. wps不记录打开打开的文件

    “工具”中的“选项”后,进入选项界面,在“常规与保存”选项卡中把“最近文档管理列出文件”前面的勾取消或将后面的数字选为0.

  2. Java异常处理之InvocationTargetException(反射异常)

     Java异常处理之InvocationTargetException(反射异常) InvocationTargetException异常由Method.invoke(obj, args...)方法抛 ...

  3. jquery 中 $ 符的意义

    $()就是一个函数名,别把它想得这么神奇.$就是一个字符,比如function a(){};function $(){};是一样的.只是jquery中习惯用$函数来作为对象化的入口而已.你也可以把jq ...

  4. WampServer 常见问题

    Wamp就是Windows 下的Apache Mysql PHP集成环境. 支持phpmyadmin 注意:安装前请先安装VC 2010运行库(vcredist2010.exe ),否则会提示没有找到 ...

  5. js 获取地址栏最后一个文件名称

    var JsRequest={ //这就是一个静态类,类里面有2个静态方法 //方法一:获取url的文件名 例如 index.html getUrlname:function(url){ //假如传进 ...

  6. print、print_r、echo到底有什么区别?

    echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出 echo 会更快,而print_r通常用于打印变量的相关信息,通常在 ...

  7. linux系统Qt实现简单的任务管理器

    继续上次的操作系统课设,这次需要设计一个简单的任务管理器,大部分人选择GTK来实现,我剑走偏锋,使用Qt来完成这个任务. 用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数.由于 ...

  8. python-函数中的参数类型和可变参数解析

    最近,在学习python,天天抱着廖雪峰的教材苦练,https://www.liaoxuefeng.com/ 但廖老毕竟是如此的才华盈溢,我这等小辈真是读起来教程都有些费力. 关于python-函数中 ...

  9. C#之内存分配

    在C#中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等 ...

  10. (转)linux用文件锁实现保证一个程序只能启动一个进程

    #include <stdio.h> #include <unistd.h>#include <fcntl.h>#include <errno.h>in ...