整理日: 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. hdu 4523 威威猫系列故事——过生日 小模拟

    威威猫系列故事——过生日 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  2. Linux进程间通信——使用数据报套接字

    前一篇文章, Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报 ...

  3. mybatis12 Usermapper.xml

    输入和输出映射 通过parameterType完成输入映射,通过resultType和resultMap完成输出映射. 1.1parameterType传递pojo包装对象 可以定义pojo包装类型扩 ...

  4. .net缓存应用与分析

    在 ASP.NET 提供的许多特性中,相比 ASP.NET 的所有其他特性,缓存对应用程序的性能具有最大的潜在影响,利用缓存和其他机制,ASP.NET 开发人员可以接受使用开销很大的控件(例如,Dat ...

  5. linux64下安装swftools

    在文档转换器中,需要在linux上安装swftools,经历了一番曲折过程终于安装成功.swftools安装包从http://www.swftools.org/download.html上面下载. 在 ...

  6. datebox清除按钮,datebox加上清除按钮,easyui datebox加上清除按钮

    datebox加上清除按钮,easyui datebox加上清除按钮 >>>>>>>>>>>>>>>>& ...

  7. asp.net 使用IHttpModule 做权限检查 登录超时检查(转)

    IHttpModule 权限 检查 登录超时检查 这样就不需要每个页面都做一次检查 也不需要继承任何父类. using System;using System.Collections.Generic; ...

  8. 学习完毕-css

    最近零零散散学习了css 最后附带链接,里面有css的全部demo.有空的可以练习练习,下一步 --->js -----http://www.w3cschool.cc/css/css-examp ...

  9. [Session] SessionHelper---C#操作Session的帮助类 (转载)

    点击下载 SessionHelper.rar 下面是代码大家看一下 这个类主要是关于Session的基本操作比如:1.获取Session值2.设置一个Session的值3.清空所有的Session4. ...

  10. SQL语句一之建库

    USE master --转到系统表goIF EXISTS(SELECT *  FROM sysdatabases WHERE name ='Test') --查询是否存在Test数据库DROP DA ...