对图形界面有兴趣的朋友们请进,来者有分!!!!!!

rockswang 2001-03-08 12:09:00
我现在正在写作一个关于图形实用技术的讲座,同时随讲座free发放的DIB图形库也在紧张的编码测试中,库函数头文件第一版也已发布在http://www.csdn.net/expert/TopicView.asp?id=80822
大家可以看到,代码是最大程度优化的,所提供的库函数也基本上与GDI互补,而不是重复。像实现异型窗口的功能更是无缝的集成在库里,相信今后实现异型窗口,和类似office2k那样的助手功能将变得异常简单。
当然代码完成度还只有40%,希望能听到大家的改进意见。

大家一定和我一样,对GDI的位图操作机制感到很麻烦,实现一个透明Blt也要专门制作一张Mask位图,复杂而低效。用DirectX虽然简单,但DX入门较难也是公认的。而这套库函数针对大家的最常用的需要,提供类似DDRAW的接口,同时在多方面都有增强,比如高质量的放缩,图形的旋转,AlphaBlending, CreateRegion(即使在DX里,无级旋转和半透明也要借助D3D来完成,而D3D更是对使用者有相当的图形学基础要求)。更重要的是,库函数是完全自由的,只要有需要,就一定有人去扩展它,就像PHP一样(当然这有赖于您的参与)!

我有个心愿,那就是有更多的人都来用这套库函数来编制图形界面程序,并且和我一起来完善它,扩展它。新手也能通过这套库的代码学到大量的实用编程技巧,代码优化技术,图形学基本知识。

BTW,我想给我的讲座改改名,不再冠以网站名。“实战图形编程”如何?

请感兴趣的朋友仔细阅读库函数头文件(http://www.csdn.net/expert/TopicView.asp?id=80822)
那里的100分用来答谢您的宝贵意见。

讲座前言部分已经完成,详细讲述设计思想,请访问我的主页(wannaplay.51.net)


第一讲预告!
详细讲述DibApi.h里的类,接口,函数,数据结构定义,编程优化技术,请对代码有疑问的朋友关注!

rocks_lee@263.net
http://wannaplay.51.net
...全文
2158 78 打赏 收藏 转发到动态 举报
写回复
用AI写文章
78 条回复
切换为时间正序
请发表友善的回复…
发表回复
rockswang 2001-07-18
  • 打赏
  • 举报
回复
给分了
leky2000 2001-06-27
  • 打赏
  • 举报
回复
骗子兄,我们都来晚了。:)
seesi 2001-06-27
  • 打赏
  • 举报
回复
不错不错。
leonf 2001-04-05
  • 打赏
  • 举报
回复
终于从头看到尾,又看了你的网站,确实不错,可以说是我们的福音,希望你做的更好,那我们就可以真正的从软件开发中得到大解放了.(对我来说最伤脑筋是图象编程)
windindance 2001-04-04
  • 打赏
  • 举报
回复
gz
egenie 2001-04-04
  • 打赏
  • 举报
回复
愿意关心图形界面编程。
山中涛大爷 2001-04-04
  • 打赏
  • 举报
回复
一句话,佩服!
rockswang 2001-04-04
  • 打赏
  • 举报
回复
把进度向大家通报一下:)
Feature List:

· 完全开放源代码

· 全部算法均建立在24位真彩图像格式之上

· 核心API算法与平台无关

· 方便快速的与GDI相互转换

· 直接从图像数据创建异型区域(未完成)

· 易于扩展的通用图像滤波器(可以对局部绿波)

· 内建8位,24位Bitmap访问支持(8,24位读取,24位保存),提供其它图像格式的访问接口

· 支持透明色的图像Blit,自动进行目标矩形裁剪

· 图像翻转(水平,垂直)

· 高速任意比例图像放缩

· 高速任意角度图像旋转

· 基于二次线性插值的高质量图像放缩和旋转(未完成)

· 半透明图像混合(未完成)

Rate 2001-04-04
  • 打赏
  • 举报
回复
我还没看完,不了解为什么说这能够跨平台?
rockswang 2001-04-04
  • 打赏
  • 举报
回复
呵呵,把前几天贴的贴子copy来烘托一下气氛:)
这个版本可是没有bug的哟!

请体验WannaPlayDIB实用图形库带给你的高性能!!
你可以看到,代码并不复杂,但速度飞快,画面效果绝对可以达到图像处理软件的水平!!

3000*2250*24位图(文件体积达20M)任意角度旋转只要3.8秒!!
640*480*24只要0.22s!!!!
(测试机器PIII733+256M)

关于“实战图形编程”讲座和WannaPlayDIB图形库的更详细内容,
以及获得完整的源代码,请访问:
我的主页: http://wannaplay.51.net
我的email:rocks_lee@263.net

void CALLBACK dib_Rotate90Filter(CDib *pDib, int x, int y, BYTE *pixel, void *scanLines) {
BYTE *curLine = *((BYTE**)scanLines+x);
int mappedX = pDib->m_nHeight-1-y;
dib_SetColor(pixel, dib_GetColor(curLine+mappedX+mappedX+mappedX));
}

void CALLBACK dib_Rotate270Filter(CDib *pDib, int x, int y, BYTE *pixel, void *scanLines) {
BYTE *curLine = *((BYTE**)scanLines+pDib->m_nWidth-1-x);
dib_SetColor(pixel, dib_GetColor(curLine+y+y+y));
}

void dib_GetEdgeFormulas(POINT *vertex, LPSIZE pNewSize, int *edgeSlope, int *edgeConst) {
int xMin = vertex[0].x;
int yMax = vertex[1].y;
pNewSize->cx = vertex[2].x - xMin;
pNewSize->cy = yMax - vertex[3].y;
int i;
for (i = 0; i < 4; i++) {
vertex[i].x -= xMin;
vertex[i].y -= yMax;
}
int slopeLeft = (int)((vertex[1].x - vertex[0].x)/(float)(vertex[1].y - vertex[0].y) * 65536.0 + 0.5);
int slopeRight = (int)((vertex[2].x - vertex[1].x)/(float)(vertex[2].y - vertex[1].y) * 65536.0 + 0.5);
int slopes[] = {slopeLeft, slopeRight, slopeRight, slopeLeft};
memcpy(edgeSlope, slopes, sizeof(int)<<2);
int consts[] = {
(vertex[0].x << 16) - slopes[0] * vertex[0].y,
(vertex[0].x << 16) - slopes[1] * vertex[0].y,
(vertex[2].x << 16) - slopes[2] * vertex[2].y,
(vertex[2].x << 16) - slopes[3] * vertex[2].y
};
memcpy(edgeConst, consts, sizeof(int)<<2);
}

void DIB_RotateFast(CDib *pDib, int nAngle) {
int i, j;
CDib *pTmp;
nAngle %= 360;
BYTE **scanLines = new BYTE*[pDib->m_nHeight];
BYTE *pScanLine = pDib->m_pBits;
for (i = 0; i < pDib->m_nHeight; i++) {
*(scanLines+i) = pScanLine;
pScanLine += pDib->m_nPitch;
}
switch (nAngle) {
case 0:
delete scanLines;
return;
case 90:
pTmp = new CDib(pDib->m_nHeight, pDib->m_nWidth, COLOR_BLACK);
DIB_Filter(pTmp, dib_Rotate90Filter, scanLines);
*pDib = *pTmp;
delete scanLines;
delete pTmp;
return;
case 180:
DIB_Flip(pDib, FLIP_HORIZONTAL ¦ FLIP_VERTICAL);
return;
case 270:
pTmp = new CDib(pDib->m_nHeight, pDib->m_nWidth, COLOR_BLACK);
DIB_Filter(pTmp, dib_Rotate270Filter, scanLines);
*pDib = *pTmp;
delete scanLines;
delete pTmp;
return;
default:
break;
}
double dAngle = nAngle/180.0 * PI;
int nSin = (int)(sin(dAngle)*65536.0+0.5);
int nCos = (int)(cos(dAngle)*65536.0+0.5);
POINT vertex[] = {
{0, 0},
{(pDib->m_nWidth*nCos) >> 16, (pDib->m_nWidth*nSin) >> 16},
{(pDib->m_nWidth*nCos + pDib->m_nHeight*nSin) >> 16, (pDib->m_nWidth*nSin - pDib->m_nHeight*nCos) >> 16},
{(pDib->m_nHeight*nSin) >> 16, (-pDib->m_nHeight*nCos) >> 16}
};
POINT newVertex[4];
if (nAngle > 0 && nAngle < 90) {
newVertex[0] = vertex[0];
newVertex[1] = vertex[1];
newVertex[2] = vertex[2];
newVertex[3] = vertex[3];
} else if (nAngle > 90 && nAngle < 180) {
newVertex[0] = vertex[1];
newVertex[1] = vertex[2];
newVertex[2] = vertex[3];
newVertex[3] = vertex[0];
} else if (nAngle > 180 && nAngle < 270) {
newVertex[0] = vertex[2];
newVertex[1] = vertex[3];
newVertex[2] = vertex[0];
newVertex[3] = vertex[1];
} else {
newVertex[0] = vertex[3];
newVertex[1] = vertex[0];
newVertex[2] = vertex[1];
newVertex[3] = vertex[2];
}
SIZE newSize;
int edgeSlope[4];
int edgeConst[4];
int deltaX = nCos*newVertex[0].x+nSin*newVertex[1].y;
int deltaY = nCos*newVertex[1].y-nSin*newVertex[0].x;
dib_GetEdgeFormulas(newVertex, &newSize, edgeSlope, edgeConst);
pTmp = new CDib(newSize.cx, newSize.cy, COLOR_BLACK);
int ox, oy;
int boundLeft, boundRight;
BYTE *pVInc = pTmp->m_pBits; // 初始化为第一个扫描行的首地址(也就是整个图像数据的首址)
// 水平方向的增量指针。每操作完一个像素,它就被指向下一个像素
BYTE *pHInc = NULL; // 它将在每次对一个扫描行开始处理之前被赋值
int actualY = -pTmp->m_nHeight;
for (i = 0; i > actualY; i--) {
if (i > newVertex[0].y) {
boundLeft = (edgeSlope[0]*i + edgeConst[0]) >> 16;
} else {
boundLeft = (edgeSlope[1]*i + edgeConst[1]) >> 16;
}
if (i > newVertex[2].y) {
boundRight = (edgeSlope[2]*i + edgeConst[2]) >> 16;
} else {
boundRight = (edgeSlope[3]*i + edgeConst[3]) >> 16;
}
pHInc = pVInc+boundLeft+boundLeft+boundLeft; // 把水平增量指针初始化为当前扫描行的首址
for (j = boundLeft; j < boundRight; j++) {
ox = (nCos*j+nSin*i+deltaX) >> 16;
oy = -((nCos*i-nSin*j+deltaY) >> 16);
ox = ox < 0 ? 0 : ox;
ox = ox >= pDib->m_nWidth ? pDib->m_nWidth-1 : ox;
oy = oy < 0 ? 0 : oy;
oy = oy >= pDib->m_nHeight ? pDib->m_nHeight-1 : oy;
dib_SetColor(pHInc, dib_GetColor(*(scanLines+oy)+ox+ox+ox));
pHInc += PIXELSIZE; // 一个像素数据过滤完成,指针指向下一个
}
pVInc += pTmp->m_nPitch; // 一个扫描行处理完,指针指向下一行
}
*pDib = *pTmp;
delete scanLines;
delete pTmp;
}
Rate 2001-04-04
  • 打赏
  • 举报
回复
我看了,很高兴我能开始在这里听关于图形编程的课...
谢谢rocks_lee...
Rate 2001-04-04
  • 打赏
  • 举报
回复
虽然我不太懂,但我支持...
daoke 2001-04-04
  • 打赏
  • 举报
回复
图形编程我想学习,特别是向AUTHORWARE中的各种转场效果如何编写
算法有没有现成的啊,有的话,呵呵,多谢了
rockswang 2001-04-03
  • 打赏
  • 举报
回复
csdn太慢了:(
代码结构有改动,
支持透明色的Blt完成了,支持自动目标矩形裁剪,比DX还好用哟!
rockswang 2001-03-22
  • 打赏
  • 举报
回复
我要day day up :)
rockswang 2001-03-22
  • 打赏
  • 举报
回复
“实战图形编程”第一讲完成了,新版代码提供打包下载。
另外我的图形论坛开张了!
希望看到大家对讲座的评价,有什么讲座没说清楚的请一定告诉我!我希望我的讲座能够被更多的人接受!
如果大家有什么图形问题,欢迎到我的论坛提出,和大家共同探讨!
请访问http://wannaplay.51.net
email:rocks_lee@263.net
rockswang 2001-03-20
  • 打赏
  • 举报
回复
攻坚了两个晚上,终于把高速图像旋转算法搞定了,要知道,我的数学可是出名的差呀!
现在WannaPlayDIB库支持高速图形放缩和高速旋转,算法还没注释,旋转在接近91和271等角度还有bug,修改中……
请访问
http://wannaplay.51.net/interfac.html
rocks_lee@263.net
rockswang 2001-03-14
  • 打赏
  • 举报
回复
最近真忙,进度比较慢……
APIer 2001-03-14
  • 打赏
  • 举报
回复
ycw(瘪四) 
APIer的email APIer@china.com 这里谢谢你了,程序有注释么?希望有阿:)
rockswang 2001-03-13
  • 打赏
  • 举报
回复
代码更新了!Fix了N个Bug,增加了DIB_FilterRect,很实用!!

用WannaPlayDIB实现的界面特效演示程序第一版上传!
包括全部演示程序的源代码,里面实现了一个简单的灰度化过滤器,供大家参考。

请到http://wannaplay.51.net/interfac.html下载。
能帮我解决那个对话框问题的高手请留言,谢谢!!

http://wannaplay.51.net
rocks_lee@263.net
加载更多回复(58)

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧