博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wxWidgets第十五课 wxBitmap图片显示
阅读量:7121 次
发布时间:2019-06-28

本文共 2029 字,大约阅读时间需要 6 分钟。

说明

    显示一张图片,非常容易


例子

  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,如需转载请自行联系原作者
你可能感兴趣的文章
量化:大数据时代的企业管理
查看>>
The 10 Commandments of Web Design
查看>>
javascript:Bing Maps AJAX Control, Version 7.0
查看>>
man命令使用
查看>>
TP-LINK Mini系列无线路由器设置指南(四)――Bridge模式
查看>>
阿朗VitalQip、Infoblox产品
查看>>
童子军与军规
查看>>
全面解析MFC应用程序框架
查看>>
在SharePoint Server 2010中更改“我的网站”
查看>>
十个Flex/Air疑难杂症及解决方案简略
查看>>
boost::asio::ip::tcp实现网络通信的小例子(转载)
查看>>
Spring Boot 官方文档学习(二)特点
查看>>
【Access2007】Access2007的打开方式
查看>>
安装和运行Maven
查看>>
铿铿蓝牙斗地主 破解
查看>>
本机win7系统与虚拟机中的linux系统实现通讯
查看>>
解决Mysql远程连接出错不允许访问 ERROR 1130:Host is not allow
查看>>
HDOJ1257
查看>>
指定步长中间值
查看>>
《伟大是熬出来的》冯仑与年轻人闲话人生之一
查看>>