重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
說明
牡丹江網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
顯示一張圖片,非常容易
例子
wxImage p_w_picpath(wxT("C:/timg.bmp"), wxBITMAP_TYPE_BMP);
wxBitmap bitmap(p_w_picpath);
wxBufferedPaintDC dc(this);
dc.DrawBitmap(bitmap, 0, 0, true);
問題
嘗試調(diào)用Create函數(shù)指定圖片的原始數(shù)據(jù),當(dāng)前使用bmp位圖為例子,bmp的偏移54個字節(jié)之后是調(diào)色板,但是當(dāng)前使用24色
位圖,所以沒有調(diào)色板,后面直接是圖片數(shù)據(jù),生辰位圖出錯,記錄如下:
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渲染,存在一塊渲染緩存區(qū)域,實際上就是一塊內(nèi)存區(qū)域保存每一個像素的RGBA數(shù)據(jù)。在已有的章節(jié)中,可以使用Win32 API,但是從整一個過程可以看到,過程比較繁瑣,并且會導(dǎo)致已有的wxClientDC等不能使用DrawText函數(shù)的問題。如果wxBitmap能夠綁定一塊渲染緩存,或許能夠完美的解決該問題
測試結(jié)果
實際上,調(diào)用wxBitmap的Create函數(shù)返回值永遠(yuǎn)是false,并且跟蹤源代碼bitmap.cpp發(fā)現(xiàn),通過調(diào)用基類wxBitmapHandler的派生類Create函數(shù)來實現(xiàn),但是派生類的的具體實現(xiàn)只有一句話:return false; 說明實現(xiàn)的并不完整,因此下面的測試代碼不能實現(xiàn)基本功能
測試代碼
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;