win32画线考虑去锯齿
整理日: 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画线考虑去锯齿的更多相关文章
- PHP合成图片、生成文字、居中对齐、画线、矩形、三角形、多边形、图片抗锯齿、不失真 高性能源码示例
function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( ...
- CGContextRef 画线简单用法
CGContextRef CGContextMoveToPoint(context,150,50);//圆弧的起始点 CGContextAddArcToPoint(context,100,80,130 ...
- C#使用 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绘图(03)-画线
一.前言 画线与画点基本上代码是相同.区别在于glBegin()的参数.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二. ...
- android 屏幕上面画线
作业如下:在android屏幕上面任意画线 package feng.f121.drawline;//本人创建的包名,每人有每人的不同的包 import java.security.PublicKey ...
- unity3d NavMeshAgent 寻路画线/画路径
今天在群里看见有个小伙在问Game视图寻路时怎么画线 正好前几天写了个寻路,而且自己也不知道具体怎么在寻路时画线,所以决定帮帮他,自己也好学习一下 在百度查了一下资料,直接搜寻路画路径.寻路画线... ...
- openGL线型和线宽以及线的抗锯齿
openGL线型和线宽以及线抗锯齿 一. 线宽 Opengl的线宽设置:glLineWidth(width); width为float类型值,在0~10.0,大于10以上按10来处理. 若开启线的反走 ...
- 用OpenGL画线
. 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常 ...
随机推荐
- DocX组件读取与写入Word
本文转载:http://www.cnblogs.com/yanweidie/p/3861482.html 由于上周工作比较繁忙,所以这篇文章等了这么久才写(预告一下,下一个章节正式进入NVelocit ...
- myeclipes使用过程中的错误解决方案
1.‘Building workspace’ has encountered a problem. Errors occurred during the build. 解决方案:这样的错误,主要是由于 ...
- [Redux] Colocating Selectors with Reducers
We will learn how to encapsulate the knowledge about the state shape in the reducer files, so that t ...
- 【MongoDB安装和基础学习系列】
转:http://www.cnblogs.com/lipan/archive/2011/03/08/1977691.html 系列目录 MongoDB学习笔记(一) MongoDB介绍及安装 ...
- android 75 新闻列表页面
new.xml <?xml version="1.0" encoding="UTF-8" ?> <newslist> <news& ...
- JAVA 强引用、软引用、弱引用、虚引用
http://www.cnblogs.com/absfree/p/5555687.html
- QuaZip实现多文件打包
项目需求: 在Goldenfarm客户端中当用户选择了本地场景文件,并进行本地场景文件分析后会产生分析结果,分析结果主要包括:贴图纹理.可渲染层等,其中贴图纹理指出了在场景文件中使用到的贴图或其它文件 ...
- springMVC+freemarker中Could not resolve view with name... 问题解决
用到springMVC+freemarker,自己在做demo过程中报: 严重: Servlet.service() for servlet springmvc threw exception jav ...
- ASCII 对应表 CHR()
chr(9) tab空格 chr(10) 换行 chr(13) 回车 chr(13)&chr(10) 回车换行 chr(32) 空格符 ...
- Java GetAndPost
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...