(转)任意角度的高质量的快速的图…
2016-12-25 12:21
134 查看
E:优化内部循环的判断函数PixelsIsInPic,将判断展开到内部循环之外,跳过不需要处理的目标像素;
TRotaryClipData类用于寻找旋转需要处理的边界范围;算法思路是首先寻找原图片中心点对应的;
那条扫描线,然后依次向上和向下寻找边界;
如果想要更快速的边界寻找算法,可以考虑利用像素的直线
绘制原理来自动生成边界(有机会的时候再来实现它);
边界寻找算法图示
struct TRotaryClipData{
public:
long
src_width;
long
src_height;
long
dst_width;
long
dst_height;
long
Ax_16;
long
Ay_16;
long
Bx_16;
long
By_16;
long
Cx_16;
long
Cy_16;
public:
long
out_dst_up_y;
long
out_dst_down_y;
long
out_src_x0_16;
long
out_src_y0_16;
private:
long
out_dst_up_x0;
long
out_dst_up_x1;
long
out_dst_down_x0;
long
out_dst_down_x1;
public:
inline long
get_up_x0(){ if (out_dst_up_x0<0) return
0; else return out_dst_up_x0; }
inline long
get_up_x1(){ if (out_dst_up_x1>=dst_width) return
dst_width; else return out_dst_up_x1; }
inline long
get_down_x0(){ if (out_dst_down_x0<0) return
0; else return out_dst_down_x0; }
inline long
get_down_x1(){ if (out_dst_down_x1>=dst_width)
return dst_width; else return out_dst_down_x1;
}
inline
bool is_in_src(long src_x_16,long src_y_16)
{
return ( (
(src_x_16>=0)&&((src_x_16>>16)<src_width)
)
&& (
(src_y_16>=0)&&((src_y_16>>16)<src_height)
) );
}
void
find_begin_in(long dst_y,long&
out_dst_x,long& src_x_16,long&
src_y_16)
{
src_x_16-=Ax_16;
src_y_16-=Ay_16;
while (is_in_src(src_x_16,src_y_16))
{
--out_dst_x;
src_x_16-=Ax_16;
src_y_16-=Ay_16;
}
src_x_16+=Ax_16;
src_y_16+=Ay_16;
}
bool
find_begin(long dst_y,long& out_dst_x0,long
dst_x1)
{
long test_dst_x0=out_dst_x0-1;
long src_x_16=Ax_16*test_dst_x0 + Bx_16*dst_y + Cx_16;
long src_y_16=Ay_16*test_dst_x0 + By_16*dst_y + Cy_16;
for (long i=test_dst_x0;i<=dst_x1;++i)
{
if (is_in_src(src_x_16,src_y_16))
{
out_dst_x0=i;
if (i==test_dst_x0)
find_begin_in(dst_y,out_dst_x0,src_x_16,src_y_16);
TRotaryClipData类用于寻找旋转需要处理的边界范围;算法思路是首先寻找原图片中心点对应的;
那条扫描线,然后依次向上和向下寻找边界;
如果想要更快速的边界寻找算法,可以考虑利用像素的直线
绘制原理来自动生成边界(有机会的时候再来实现它);
边界寻找算法图示
struct TRotaryClipData{
public:
long
src_width;
long
src_height;
long
dst_width;
long
dst_height;
long
Ax_16;
long
Ay_16;
long
Bx_16;
long
By_16;
long
Cx_16;
long
Cy_16;
public:
long
out_dst_up_y;
long
out_dst_down_y;
long
out_src_x0_16;
long
out_src_y0_16;
private:
long
out_dst_up_x0;
long
out_dst_up_x1;
long
out_dst_down_x0;
long
out_dst_down_x1;
public:
inline long
get_up_x0(){ if (out_dst_up_x0<0) return
0; else return out_dst_up_x0; }
inline long
get_up_x1(){ if (out_dst_up_x1>=dst_width) return
dst_width; else return out_dst_up_x1; }
inline long
get_down_x0(){ if (out_dst_down_x0<0) return
0; else return out_dst_down_x0; }
inline long
get_down_x1(){ if (out_dst_down_x1>=dst_width)
return dst_width; else return out_dst_down_x1;
}
inline
bool is_in_src(long src_x_16,long src_y_16)
{
return ( (
(src_x_16>=0)&&((src_x_16>>16)<src_width)
)
&& (
(src_y_16>=0)&&((src_y_16>>16)<src_height)
) );
}
void
find_begin_in(long dst_y,long&
out_dst_x,long& src_x_16,long&
src_y_16)
{
src_x_16-=Ax_16;
src_y_16-=Ay_16;
while (is_in_src(src_x_16,src_y_16))
{
--out_dst_x;
src_x_16-=Ax_16;
src_y_16-=Ay_16;
}
src_x_16+=Ax_16;
src_y_16+=Ay_16;
}
bool
find_begin(long dst_y,long& out_dst_x0,long
dst_x1)
{
long test_dst_x0=out_dst_x0-1;
long src_x_16=Ax_16*test_dst_x0 + Bx_16*dst_y + Cx_16;
long src_y_16=Ay_16*test_dst_x0 + By_16*dst_y + Cy_16;
for (long i=test_dst_x0;i<=dst_x1;++i)
{
if (is_in_src(src_x_16,src_y_16))
{
out_dst_x0=i;
if (i==test_dst_x0)
find_begin_in(dst_y,out_dst_x0,src_x_16,src_y_16);
相关文章推荐
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 中篇 高质量的旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转
- (转)任意角度的高质量的快速的图…
- 图形图像处理-之-任意角度的高质量的快速的图像旋转
- (转)任意角度的高质量的快速的图…
- 任意角度的高质量的快速的图像旋转
- 图形图像处理 —— 任意角度的高质量的快速的图像旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 下篇 补充话题
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 下篇 补充话题
- 任意角度的高质量的快速的图像旋转 中篇 高质量的旋转
- 基于C++图像处理-任意角度的高质量的快速的图像旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 中篇 高质量的旋转
- 任意角度的高质量的快速的图像旋转 下篇 补充话题
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 下篇 高质量的旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转
- 图形图像处理-之-任意角度的高质量的快速的图像旋转