使用GetPixel要注意

2021-08-23 11:45:31 字數 3191 閱讀 5321

今天遇到乙個問題,除錯了一天都沒有搞明白。任務是這樣的:將乙個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...