开发者社区> 技术小胖子> 正文

wxWidgets第十五课 wxBitmap图片显示

简介:
+关注继续查看

说明

    显示一张图片,非常容易


例子

  wxImage image(wxT("C:/timg.bmp"), wxBITMAP_TYPE_BMP);

wxBitmap bitmap(image);

  wxBufferedPaintDC dc(this);

dc.DrawBitmap(bitmap, 0, 0, true);


问题

    尝试调用Create函数指定图片的原始数据,当前使用bmp位图为例子,bmp的偏移54个字节之后是调色板,但是当前使用24色


位图,所以没有调色板,后面直接是图片数据,生辰位图出错,记录如下:

FILE * fileFd;

long fileLen;


fileFd = fopen ("C:/timg.bmp","rb");

if (fileFd==NULL)

{

return ;

}

else

{

fseek (fileFd, 0, SEEK_END);  

fileLen=ftell (fileFd); 

}

char* pRawData = (char*)malloc(fileLen-54);

fseek (fileFd, 54, SEEK_SET);

fputs(pRawData, fileFd);   

fclose(fileFd);

wxBitmap bitmap;

bitmap.Create(pRawData, wxBITMAP_TYPE_BMP, 1024, 626);

wxBufferedPaintDC dc(this);

dc.DrawBitmap(bitmap, 0, 0, true);



说明

使用AGG渲染,存在一块渲染缓存区域,实际上就是一块内存区域保存每一个像素的RGBA数据。在已有的章节中,可以使用Win32 API,但是从整一个过程可以看到,过程比较繁琐,并且会导致已有的wxClientDC等不能使用DrawText函数的问题。如果wxBitmap能够绑定一块渲染缓存,或许能够完美的解决该问题


测试结果

实际上,调用wxBitmap的Create函数返回值永远是false,并且跟踪源代码bitmap.cpp发现,通过调用基类wxBitmapHandler的派生类Create函数来实现,但是派生类的的具体实现只有一句话:return false; 说明实现的并不完整,因此下面的测试代码不能实现基本功能


测试代码

char* pData = (char*)malloc(width*height*4);

memset(pData, 0xff, width*height*4);


wxBitmap bitmap;

bool ret = bitmap.Create(pData, wxBITMAP_TYPE_BMP_RESOURCE, width, height, 1);//wxBITMAP_TYPE_BMP

m_rbuf.attach((unsigned char*)pData, width, height, -width*4); // Use negative stride in order

m_pixf.attach(m_rbuf);

m_renb.attach(m_pixf);

m_ren.attach(m_renb);


m_renb.clear(agg::rgba8(0, 0, 0, 255));


m_ras.move_to_d(100, 34.15);

m_ras.line_to_d(398.23, 123.43);

m_ras.line_to_d(165.45, 401.87);


// Setting the attrribute (color) & Rendering

m_ren.color(agg::rgba8(80, 90, 60));

agg::render_scanlines(m_ras, m_sl, m_ren);


wxMemoryDC memDC;

memDC.SelectObject(bitmap);

memDC.SetPen(*wxRED_PEN);

memDC.DrawRectangle((wxRect(10, 10, 100, 100)));

wxBufferedPaintDC destDC(this);

 destDC.SetBackground(*wxWHITE_BRUSH);

 destDC.Clear();

destDC.Blit(0, 0,

bitmap.GetWidth(), bitmap.GetHeight(),

&memDC,

0, 0,

wxCOPY,

true);

memDC.SelectObject(wxNullBitmap);

return;




     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1955426,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
超实用技巧,代码跟踪器
超实用技巧,代码跟踪器
37 0
21天打卡Andoid学到的一些小知识-第十五十六天
学习的最大理由是想摆脱平庸 今天我们学习打卡的内容是:Android 10.0 app获取不到序列号解决方案
24 0
耗时三小时写了一个图形化的贪吃蛇(第一次使用easyx图形库)算是对学习的小小实战吧
熬夜连干三个小时写了这个小游戏,虽然很简单,我这次只写了无敌模式,你也可以自己继续优化,但是我收获了很多,就来分享一下我遇到的问题和逻辑。 效果(gif没有背景音乐,实际上是有的):
142 0
“对不起,我选择摸鱼”—《扫雷》小游戏开发实战,算法、源代码,基于Unity3D开发
今天又是摸鱼...哦不..工作的一天,今天整一个很经典的Win系统自带游戏——《扫雷》,话说安装Win10之后就找不到《扫雷》游戏了,很难受。 《扫雷》游戏的玩法是,在不触碰到任何地雷的情况下去发现一个雷区。 揭开一个没有地雷的块之后,将会显示一个数字来表示周围地雷的数量。 跟往常一样,会尽量的将步骤详细说明,代码也进行注释,可以让大家都可以理解。
119 0
Unity零基础到进阶 ✨ 使用 Vectrosity 插件 像德芙一样丝滑的画线
Vectrosity画线插件 ☀️ Unity画线插件Vectrosity 🔥 在使用Unity进行开发的过程中,我们在某些时候需要使用到划线功能,使用Unity中的几种划线方法自然可行,但是我们可以用一种更方便的方式来进行划线操作,那就是我们的主角:Vectrosity插件👍!
399 0
边学边做的第一个Unity小游戏
学Unity开发,肯定先要了解小Unity这个开发工具长什么样。 第一次看到Unity界面的时候,我第一反应是,我靠,这不是犀牛么。学工业设计的人应该接触过犀牛这款3D建模软件,主界面也是一个3D透视界面。
1402 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
ios开发者必读咨讯
立即下载
骨骼动画实践
立即下载
《阿里巴巴Android开发手册》
立即下载