今天遇到乙個問題,除錯了一天都沒有搞明白。任務是這樣的:將乙個bitmap放到乙個dc裡,然後獲取這個dc裡的某一點的rgb值。情況正如下:
cfile file; //用於讀取bmp檔案
bitmapfileheader bfhheader; //bmp檔案頭
bitmapinfoheader bmiheader; //bmp格式頭
lpbitmapinfo lpbitmapinfo; //bmp格式具體資訊
int bmpwidth=0; //寬度
int bmpheight = 0; //高度
if( !file.open( filepath, cfile::moderead ) )
return ; //開啟檔案
//讀取檔案頭
file.read(&bfhheader,sizeof(bitmapfileheader));
if(bfhheader.bftype!=((word) ('m'
<<8)|'b')) //判斷是否是"bm"
return ;
if(bfhheader.bfsize!=file.getlength())
return ;
//讀取位圖資訊
if (file.read((lpstr)&bmiheader, sizeof(bmiheader)) != sizeof(bmiheader))
return ;
bmpheight = bmiheader.biheight; //得到高度和寬度
bmpwidth = bmiheader.biwidth;
file.seektobegin(); //指標移動到檔案的開頭
file.read(&bfhheader,sizeof(bitmapfileheader));
uint ubmpinfolen=(uint) bfhheader.bfoffbits-sizeof(bitmapfileheader);//file size
lpbitmapinfo=(lpbitmapinfo) new
byte[ubmpinfolen]; //具體資訊分配記憶體
file.read((lpvoid) lpbitmapinfo,ubmpinfolen);
if((* (lpdword)(lpbitmapinfo))!=sizeof(bitmapinfoheader))
return ;
dword dwbitlen = bfhheader.bfsize - bfhheader.bfoffbits;//影象資料的位元組大小
unsigned char *lpsrcbits=new
byte[dwbitlen];
file.readhuge(lpsrcbits,dwbitlen);
file.close(); //關閉檔案
//將檔案資料加到dc裡
cclientdc pdc(this);
//cclientdc pdc(&m_blackwhiteimage);
//cdc* pdc = null;
//hdc pdc = ::createcompatibledc( null );
//::createcompatibledc(pdc);
int ret = stretchdibits(pdc,0,0,bmpwidth,bmpheight,0,0,bmpwidth,bmpheight,
lpsrcbits,lpbitmapinfo,dib_rgb_colors,srccopy);
除錯的時候,上面執行都沒有問題,問題是:
int a = pdc.getpixel(currentbit, currentline);
a的返回值是-1,無論怎麼改,都是這個值。然後沒有辦法,只能google,有人說除錯的時候呼叫getpixel會出錯。我試了一下正常模式下執行,竟然通過了。真是的,都怪平時太依賴除錯模式了。
幾天後的更新:
原來getpixel呼叫時也是可以獲取正確的值的,但是要使用compatibledc,**如下:
if ( m_hbmp != null)
m_hbmp = (hbitmap)loadimage(afxgetinstancehandle(),
imagepath,
image_bitmap,
0,0,
lr_loadfromfile);
if ( m_hbmp == null )
else
selectblock = -1;
//將檔案資料加到dc裡
//cclientdc pdc(this);
cdc dc;
dc.createcompatibledc( null );
if ( dc == null )
hbitmap holdbmp = (hbitmap)selectobject(dc, m_hbmp);
blockscount = 0;
//遍歷各行找矩形框左上角的座標
for(int currentline = 1; currentline < m_bmheight - 1; currentline++)
}if ( 0x00ffffff == dc.getpixel(currentbit, currentline) && //自己是白點
0x00ffffff != dc.getpixel(currentbit, (currentline - 1)) && //上面是不是白點
0x00ffffff == dc.getpixel(currentbit, (currentline + 1)) && //下面是白點
0x00ffffff != dc.getpixel((currentbit - 1), currentline) && //左邊是不是白點
0x00ffffff == dc.getpixel((currentbit + 1), currentline) ) //右邊是白點
//找到乙個左上角
blocks[blockscount].pos.bottom = bottom;
uint right = currentbit;
for(;;right++)
blocks[blockscount].pos.right = right;
blocks[blockscount].id = -1;
blockscount++;}}
}if ( blockscount == 0 )
(hbitmap)selectobject(dc, holdbmp);
dc.deletedc();
這種情況下將斷點設定在
getpixel上就沒有問題了,原因是使用createcompatibledc生成的dc是裝置無關的,只是放在記憶體裡,使用getpixel獲取rgb值只是讀記憶體,而不是讀介面的顏色。
使用GetPixel要注意
今天遇到乙個問題,除錯了一天都沒有搞明白。任務是這樣的 將乙個bitmap放到乙個dc裡,然後獲取這個dc裡的某一點的rgb值。情況正如下 cfilefile 用於讀取bmp檔案 bitmapfileheaderbfhheader bmp檔案頭 bitmapinfoheaderbmiheader b...
vector的使用要注意
最近寫乙個併發的伺服器程式,乙個伺服器監聽多個埠.多個客戶端連線.這麼多監聽的socket,想到用socket儲存.自己寫了乙個類簡單封裝了底層的socket.在寫類的時候為了能正常用vector,必須要寫類的拷貝建構函式和過載等號運算子.但是在執行的時候select總是出現10038錯誤,這個錯誤...
使用Calendar需要注意clear
date是前台傳的值,格式為2014 01 01的形式 如下的 是去date日期當月的最大天數日期 int month integer.parseint date.substring 5,7 取天數 int year integer.parseint date.substring 0,4 取年份 d...