整理日: 2015年2月16日

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

在网上找了一下

http://www.codeproject.com/KB/GDI/CTGraphics.aspx

http://www.codeproject.com/KB/GDI/AntiAliasing.aspx

http://www.codeproject.com/KB/GDI-plus/AntiAliasingIssues.aspx

反走样技术之一 Wu像素

http://dev.gameres.com/Program/Visual/3D/Antialiasing.htm

http://dev.gameres.com/Program/Visual/Effects/WuLine.htm

什么是防锯齿技术?什么是亚像素? - 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;
}
} }

win32画线考虑去锯齿的更多相关文章

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

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

  2. CGContextRef 画线简单用法

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

  3. C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9

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

  4. unity3d 使用GL 方式画线

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

  5. Delphi下OpenGL2d绘图(03)-画线

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

  6. android 屏幕上面画线

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

  7. unity3d NavMeshAgent 寻路画线/画路径

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

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

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

  9. 用OpenGL画线

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

随机推荐

  1. 实践javascript美术馆的小案例,学习到的东西还是蛮多的,包括javascript编程中的预留退路、分离javascript、以及实现向后兼容等

    javascript美术馆(改进2) 一.javascript编程过程中的好习惯 1.实现预留退路 js被禁掉,图片也可以显示出来,href属性带有图片路径 <script src=" ...

  2. myeclipes使用过程中的错误解决方案

    1.‘Building workspace’ has encountered a problem. Errors occurred during the build. 解决方案:这样的错误,主要是由于 ...

  3. java基础入门-arraylist存储开销

    今天我们来看一下arraylist的存储开销,由于在项目其中,我尝试了一个很大的arraylist.然后内存爆了 所以我看了下源代码.原来arraylist的存储开销是比較大的,先上代码 import ...

  4. 偷偷mark下一个

    java书单 thinking in java java战 Effective Java 深入了解JVM虚拟机 java性能优化权威指南 JSR133 Google Guava官方教程 版权声明:本文 ...

  5. 项目中发现的一些关于JavaScript中JSON的注意点

    一个是怎样创建JSON: var obj = {}; obj['name'] = value; obj['anotherName'] = anotherValue; 假设要创建多级的JSON,则: i ...

  6. java多线程样例

    这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug; import java.io.*;import java.lang.Thread; class My ...

  7. Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

    1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...

  8. scp文件到远端机器问题总结及解决方法

    今天在download服务器日志时遇到了很多问题, 顺便把相应的解决步骤记录下方便以后查看. #把文件copy到192.168.1.102的服务器上 scp -r local_dir readonly ...

  9. phpcms 换域名

    修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名就可以了. 进行后台设置->站点管理   对相应的站点的域名进行修改. 更新系统缓存.点击 ...

  10. sqlmap

    http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sqlmap这么一个url的时候,它会: 1.判断可注入的参数 2.判断可以用那种SQL注 ...