linux底层画线去锯齿,win32画线考虑去锯齿

整理日: 2015年2月16日

这几天一直在研究win32 SDk下画线去锯齿,之前一直用的QT的画线接口函数,里面有去锯齿的效果,可是突然项目要求不能用QT的只能用win32 SDK下的GDI画线接口函数,可是显示的效果有锯齿,怎么办?只能研究下怎么去锯齿影响,因为GDI下没有去锯齿的处理,所以只能自己找算法处理。

什么是防锯齿技术?什么是亚像素? - Apple4.us

可是这些方法的画线处理不能设置线宽,我的画线处理需要线宽,按照网上找到的去锯齿的代码,我改了下代码(见后),修改的代码并不能灵活设置的线宽,两个端点处理也需要完善,最主要的是我不知道怎么去处理两个端点。搞了好几天,还是没有找到端点处理的合适方式。

void RVS_drawLine_width(HDC hDC, int x1, int y1, int x2, int y2, COLORREF color)

{

// Calculate line params

int dx = (x2 - x1);

int dy = (y2 - y1);

COLORREF bgColor;

int temp;

float k;

// X-dominant line

if (abs(dx) > abs(dy))

{

// Ex-change line end points

if (dx < 0)

{

temp = x1;

x1 = x2;

x2 = temp;

temp = y1;

y1 = y2;

y2 = temp;

}

k = (float)dy / (float)dx;

int xs;

float yt = (float)y1;

float distance;

UCHAR red, green, blue;

for (xs = x1; xs <= x2; xs++)

{

distance = (float)(yt - (int)(yt));

bgColor = ::GetPixel(hDC, xs, (int)yt - 1);

red = (UCHAR)(distance * GetRValue(bgColor)) +

(UCHAR)((1.0f - distance) * GetRValue(color));

green = (UCHAR)(distance * GetGValue(bgColor)) +

(UCHAR)((1.0f - distance) * GetGValue(color));

blue = (UCHAR)(distance * GetBValue(bgColor)) +

(UCHAR)((1.0f - distance) * GetBValue(color));

::SetPixel(hDC, xs, (int)yt - 1, RGB(red, green, blue));

// ::SetPixel(hDC, xs, (int)yt-1, color);

::SetPixel(hDC, xs, (int)yt, color);

bgColor = ::GetPixel(hDC, xs, (int)yt + 1);

red = (UCHAR)((1.0f - distance) * GetRValue(bgColor)) +

(UCHAR)(distance * GetRValue(color));

green = (UCHAR)((1.0f - distance) * GetGValue(bgColor)) +

(UCHAR)(distance * GetGValue(color));

blue = (UCHAR)((1.0f - distance) * GetBValue(bgColor)) +

(UCHAR)(distance * GetBValue(color));

::SetPixel(hDC, xs, (int)yt + 1, RGB(red, green, blue));

yt += k;

}

}

// Y-dominant line

else

{

// Ex-change line end points

if (dy < 0)

{

temp = x1;

x1 = x2;

x2 = temp;

temp = y1;

y1 = y2;

y2 = temp;

}

k = (float)dx / (float)dy;

int ys;

float xt = (float)x1;

float distance;

UCHAR red, green, blue;

for (ys = y1; ys <= y2; ys++)

{

distance = (float)(xt - (int)(xt));

bgColor = ::GetPixel(hDC, (int)xt - 1, ys);

red = (UCHAR)(distance * GetRValue(bgColor)) +

(UCHAR)((1.0f - distance) * GetRValue(color));

green = (UCHAR)(distance * GetGValue(bgColor)) +

(UCHAR)((1.0f - distance) * GetGValue(color));

blue = (UCHAR)(distance * GetBValue(bgColor)) +

(UCHAR)((1.0f - distance) * GetBValue(color));

::SetPixel(hDC, (int)xt - 1, ys, RGB(red, green, blue));

// ::SetPixel(hDC, (int)xt-1, ys, color);

::SetPixel(hDC, (int)xt, ys, color);

bgColor = ::GetPixel(hDC, (int)xt + 1, ys);

red = (UCHAR)((1.0f - distance) * GetRValue(bgColor)) +

(UCHAR)(distance * GetRValue(color));

green = (UCHAR)((1.0f - distance) * GetGValue(bgColor)) +

(UCHAR)(distance * GetGValue(color));

blue = (UCHAR)((1.0f - distance) * GetBValue(bgColor)) +

(UCHAR)(distance * GetBValue(color));

::SetPixel(hDC, (int)xt + 1, ys, RGB(red, green, blue));

xt += k;

}

}

}

PHP合成图片、生成文字、居中对齐、画线、矩形、三角形、多边形、图片抗锯齿、不失真 高性能源码示例

function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( ...

CGContextRef 画线简单用法

CGContextRef CGContextMoveToPoint(context,150,50);//圆弧的起始点 CGContextAddArcToPoint(context,100,80,130 ...

C&num;使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9

视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...

unity3d 使用GL 方式画线

这个是画线部分 private Vector3[] linePoints; public int m_LineCount; public int m_PointUsed; public void Re ...

Delphi下OpenGL2d绘图&lpar;03&rpar;-画线

一.前言 画线与画点基本上代码是相同.区别在于glBegin()的参数.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二. ...

android 屏幕上面画线

作业如下:在android屏幕上面任意画线 package feng.f121.drawline;//本人创建的包名,每人有每人的不同的包 import java.security.PublicKey ...

unity3d NavMeshAgent 寻路画线&sol;画路径

今天在群里看见有个小伙在问Game视图寻路时怎么画线 正好前几天写了个寻路,而且自己也不知道具体怎么在寻路时画线,所以决定帮帮他,自己也好学习一下 在百度查了一下资料,直接搜寻路画路径.寻路画线... ...

openGL线型和线宽以及线的抗锯齿

openGL线型和线宽以及线抗锯齿 一. 线宽 Opengl的线宽设置:glLineWidth(width); width为float类型值,在0~10.0,大于10以上按10来处理. 若开启线的反走 ...

用OpenGL画线

. 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常 ...

随机推荐

Node&period;js学习笔记(一)

1.回调函数 node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数. 例: setTimeout(function(){ console.log('callback is calle ...

android 在使用studio 编写百度地图中遇到APP Scode码校验失败 问题

直接用打包出来的apk查看签名,具体如下: 1) 将apk修改后缀为 .zip文件后解压: 2) 进入解压后的META-INF目录,该目录下会存在文件CERT.RSA 3) 在该目录下打开cmd,输入 ...

程序的链接和装入及Linux下动态链接的实现

http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行 ...

2014 ACM&sol;ICPC 鞍山赛区现场赛 D&amp&semi;amp&semi;I 解题报告

鞍山现场赛结束了呢-- 我们出的是D+E+I三道题-- 吾辈AC掉的是D和I两道,趁着还记得.先在这里写一写我写的两道水题D&I的解题报告吧^_^. D题的意思呢是说星云内有一堆排成一条直线的 ...

c&sol;c&plus;&plus; 动态申请数组

new和delete运算符用于动态分配和撤销内存的运算符 new使用方法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.in ...

架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)

本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...

python入门学习:5&period;字典

python入门学习:5.字典 关键点:字典 5.1 使用字典5.2 遍历字典5.3 嵌套 5.1 使用字典   在python中字典是一系列键-值对.每个键都和一个值关联,你可以使用键来访问与之相关 ...

Android下的软件合集

在平常使用Android手机的时候,选择一个好的软件可以做到事半功倍的效果,所以在此总结一下,加速我们的工作与生活效率 1) ConnectBot ConnectBot是一个Android操作系统上的 ...

JavaScript——this

一.JavaScript 函数与方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值