大虾帮忙!关于创建文图和在位图上画线(不用GDI对象),我该怎么做?(新手)

wangshengdao 2003-09-23 07:52:28
不用gdi对象,画线算法我已经明白了,现在问题是:我怎么创建这个位图,然后怎么在位图上画一个点,谁能给个例子关键实现?谢谢!
...全文
95 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mct1025 2003-09-30
  • 打赏
  • 举报
回复
直接操作DIB,速度能快多少
能不能达到你的需求,我也不清楚

你可以看看图形学的教程,有各种基本图形的生成算法,Bresenham算法用的比较多
到google搜一下,可能有现成的程序

区域填充、线宽与线型的处理、裁剪、反走样等 好多都要自己实现

可能很辛苦啊,呵呵
icr_mio 2003-09-30
  • 打赏
  • 举报
回复
你是直接画到窗体的DC上的吗?
为什么不用内存DC?
wangshengdao 2003-09-30
  • 打赏
  • 举报
回复
感谢各位的参与!
我现在已经有点眉目了。
问题的产生是这样的:我现在有个项目,它必须画2万条以上的曲线,每条曲线的点平均个数大约100,用GDI的MoveTo, LineTo画得800毫秒,而且还有区域和弧。而我们的要求是不能超过500毫秒,所以我考虑直接在内存位图上画,然后再显示。我不知道这个方法速度能提高多少。大家有什么好的方法吗?一定高分相送,我还有2千多可用分啊!

to mct1025:颜色24为的处理不是很方便,可以创建一个32位颜色的位图,这样一个像素一个int大小,好处理。mct1025能不能说说这方面的一些关键技术和注意事项?谢谢!!

大家踊跃发言,UP者有分,好的发言得多分。我难得提问一次,积累了几年的分终于有用武之地了。嗬嗬!
PAUL_BAI 2003-09-30
  • 打赏
  • 举报
回复
等我回去发个实例给你。
mct1025 2003-09-29
  • 打赏
  • 举报
回复
sizeof(BITMAPFILEHEADER) == 14
yaoha2003 2003-09-29
  • 打赏
  • 举报
回复
pbmh = (BITMAPINFOHEADER *)((BYTE *)pvData + 14);
这个我不懂啊,为什么是加14啊,是固定的吗?
wangshengdao 2003-09-29
  • 打赏
  • 举报
回复
谢谢mct1025,能不能再给一点这方面的例子或链接。我需要的就是直接操作位图像素。我现在还搞不懂怎么获得像素数组。谢谢!先给你这么多分。
mct1025 2003-09-29
  • 打赏
  • 举报
回复
从文件直接读取,或是用GetDIBits可以得到DIB数据

BITMAPFILEHEADER 中的bfOffBits 指向bitmap的DIB数据开始位置

BITMAPINFOHEADER 中的biHeight 高度参数决定数据存储方向,一般情况 biHeight > 0
If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower-left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper-left corner.

biBitCount :Specifies the number of bits-per-pixel.

直接操作DIB速度快,但是不太方便,比如说画一条倾斜直线,还需要自己写算法
而且根据biBitCount,处理像素的颜色位数也比较麻烦

在旋转位图中使用,是因为GetPixel,SetPixel速度实在太慢了

这方面的例子,只知道这个

我写了一下,在24位bmp底部画一条红色直线

CFileStatus fstatus;
CFile file;
LONG cb;
LPVOID pvData = NULL;
HGLOBAL hGlobal;
//读取文件
if(file.Open("c:\\start2.bmp",CFile::modeRead)&&
file.GetStatus("c:\\start2.bmp",fstatus)&&((cb =fstatus.m_size)!= -1))
{
hGlobal = GlobalAlloc(GMEM_MOVEABLE,cb);

if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal))!= NULL)
{
file.ReadHuge(pvData,cb);
GlobalUnlock(hGlobal);
file.Close();
}
}
}
BITMAPFILEHEADER *pbfh;
pbfh = (BITMAPFILEHEADER *)pvData;
BITMAPINFOHEADER *pbmh;
pbmh = (BITMAPINFOHEADER *)((BYTE *)pvData + 14);

if (pbmh->biBitCount != 24)
return;

BYTE *pDIB = (BYTE *)pvData + pbfh->bfOffBits;
for (int i = 0 ;i < pbmh->biWidth * 3;i = i + 3)
{//对于24位bmp,底部划一条红线
pDIB[i] = 0x00;//b
pDIB[i+1] = 0x00;//g
pDIB[i+2] = 0xff;//r
}
//保存文件
CFile bf;
if(bf.Open("c:\\t.bmp",CFile::modeCreate|CFile::modeWrite))
{
bf.WriteHuge(pvData,pbfh->bfSize);
bf.Close();
}
GlobalFree(hGlobal);
icr_mio 2003-09-29
  • 打赏
  • 举报
回复
你得先得到位图文件头部的信息,包括宽度,高度,颜色深度,颜色编码等...

然后根据得到的信息来操作后面的数据部分。
icr_mio 2003-09-29
  • 打赏
  • 举报
回复
楼主的意思是直接修改位图文件里的内容吧。
Microsoftadherent 2003-09-29
  • 打赏
  • 举报
回复
怎么跟我老板和我们的“高手”项目经理一样。
mct1025 2003-09-25
  • 打赏
  • 举报
回复
直接操作DIB数组

看看这个,实现图像的任意角度旋转
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=7575
wangshengdao 2003-09-25
  • 打赏
  • 举报
回复
up
fanfyj 2003-09-24
  • 打赏
  • 举报
回复
up
akun 2003-09-23
  • 打赏
  • 举报
回复
画图,不用GDI, 就是DDRAW, D3D, OPENGL....

自己写画线的算法,也要一个个点画出来不是?
bluebohe 2003-09-23
  • 打赏
  • 举报
回复
chibaolechengdebuyong 呵呵
wangshengdao 2003-09-23
  • 打赏
  • 举报
回复
是自己一个一个点在位图上画,然后再显示在屏幕上。
谁能给一点例子?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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