今天遇到乙個問題,除錯了一天都沒有搞明白。任務是這樣的:將乙個bitmap放到乙個dc裡,然後獲取這個dc裡的某一點的rgb值。情況正如下:
cfilefile;//用於讀取bmp檔案
bitmapfileheaderbfhheader;//bmp檔案頭
bitmapinfoheaderbmiheader;//bmp格式頭
lpbitmapinfolpbitmapinfo;//bmp格式具體資訊
intbmpwidth=0;//寬度
intbmpheight=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));
uintubmpinfolen=(uint)bfhheader.bfoffbits-sizeof(bitmapfileheader);//filesize
lpbitmapinfo=(lpbitmapinfo)new
byte[ubmpinfolen];//具體資訊分配記憶體
file.read((lpvoid)lpbitmapinfo,ubmpinfolen);
if((*(lpdword)(lpbitmapinfo))!=sizeof(bitmapinfoheader))
return;
dworddwbitlen=bfhheader.bfsize-bfhheader.bfoffbits;//影象資料的位元組大小
unsignedchar*lpsrcbits=new
byte[dwbitlen];
file.readhuge(lpsrcbits,dwbitlen);
file.close();//關閉檔案
//將檔案資料加到dc裡
cclientdcpdc(this);
//cclientdcpdc(&m_blackwhiteimage);
//cdc*pdc=null;
//hdcpdc=::createcompatibledc(null);
//::createcompatibledc(pdc);
intret=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裡
//cclientdcpdc(this);
cdcdc;
dc.createcompatibledc(null);
if(dc==null)
hbitmapholdbmp=(hbitmap)selectobject(dc,m_hbmp);
blockscount=0;
//遍歷各行找矩形框左上角的座標
for(intcurrentline=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;
uintright=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值。情況正如下 cfile file 用於讀取bmp檔案 bitmapfileheader bfhheader bmp檔案頭 bitmapinfoheader bmiheade...
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...