使用GetPixel要注意

2021-04-23 16:05:06 字數 3456 閱讀 4490

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