请问如何在内存中画图,并且获取其图像数据

时间:2021-07-04 14:36:25
我想在内存中画一幅图,但是我不显示它我只要他的图像数据,请高手指点

24 个解决方案

#1


首先创建一块内存DC:

CDC* m_pmemDC;
CBitmap* m_pmemBitmap;

m_pmemDC->CreateCompatibleDC(&dc);
m_pmemBitmap->CreateCompatibleBitmap(&dc, SHOWPICWIDTH,SHOWPICHEIGHT);    
m_pmemDC->SelectObject(m_pmemBitmap);

brush.CreateSolidBrush(RGB(255,255,255));
m_pmemDC->FillRect(&rectClient, &brush);

m_pmemDC就是你要的内存DC,你就可以在上面画了.

#2


先创建一个内存DC用CreateCompatibleDC 
然后就可以在这个DC上画图了

#3


那么,请问我画完图以后需要得到他的图像数据,我从哪里可以取得呢??

#4


DC啊.
图像画在DC上,肯定是从DC取数据啦.

#5


可以举一个例子吗??我是菜鸟,不要意思

#6


HBITMAP CreateCompatibleBitmap(
  HDC hdc,        // handle to DC
  int nWidth,     // width of bitmap, in pixels
  int nHeight     // height of bitmap, in pixels
);
这样你就有HBITMAP句柄了,就可以得到其中的数据了

#7


看看这个:http://blog.csdn.net/afxid/archive/2006/06/23/823992.aspx

#8


创建一个内存DC

画在它上面

需要的时候可以BitBlt到前台。

#9


akirya(坏[其实偶不是什么所谓的坏人]) ( ) 信誉:97    Blog   加为好友  2007-06-18 14:54:48  得分: 0  
 
 
   HBITMAP CreateCompatibleBitmap(
  HDC hdc,        // handle to DC
  int nWidth,     // width of bitmap, in pixels
  int nHeight     // height of bitmap, in pixels
);
这样你就有HBITMAP句柄了,就可以得到其中的数据了
  
请问,如果要得到图像的二进制数据也可以吗??谢谢

CathySun118(斯年) ( ) 信誉:100    Blog   加为好友  2007-06-18 14:56:44  得分: 0  
 
 
   看看这个:http://blog.csdn.net/afxid/archive/2006/06/23/823992.aspx
  
你给的例子我正在看,谢谢 

#10


LONG GetBitmapBits(
  HBITMAP hbmp,      // handle to bitmap
  LONG cbBuffer,     // number of bytes to copy
  LPVOID lpvBits     // buffer to receive bits
);

#11


int GetDIBits(
  HDC hdc,           // handle to DC
  HBITMAP hbmp,      // handle to bitmap
  UINT uStartScan,   // first scan line to set
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // array for bitmap bits
  LPBITMAPINFO lpbi, // bitmap data buffer
  UINT uUsage        // RGB or palette index
);

lpvBits 
[out] Pointer to a buffer to receive the bitmap data. If this parameter is NULL, the function passes the dimensions and format of the bitmap to the BITMAPINFO structure pointed to by the lpbi parameter. 
lpbi 
[in/out] Pointer to a BITMAPINFO structure that specifies the desired format for the DIB data.

#12


akirya(坏[其实偶不是什么所谓的坏人]) ( ) 信誉:97    Blog   加为好友  2007-6-18 15:12:13  得分: 0  
 
 
   
int GetDIBits(
  HDC hdc,           // handle to DC
  HBITMAP hbmp,      // handle to bitmap
  UINT uStartScan,   // first scan line to set
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // array for bitmap bits
  LPBITMAPINFO lpbi, // bitmap data buffer
  UINT uUsage        // RGB or palette index
);

lpvBits 
[out] Pointer to a buffer to receive the bitmap data. If this parameter is NULL, the function passes the dimensions and format of the bitmap to the BITMAPINFO structure pointed to by the lpbi parameter. 
lpbi 
[in/out] Pointer to a BITMAPINFO structure that specifies the desired format for the DIB data.

  
 
很感谢你的耐心回复,
我现在有GetDIBits 将数据读取到BYTE *pTemp中,可是这个*pTemp大小我该怎么获取呢??

#13


同时 LPBITMAPINFO lpbi, // bitmap data buffer,该如何设置呢??

#14


取数据代码如下(要做小的修改)
HDC hdc;
HDC mdc;
BITMAP bm;
HBITMAP hBmp;
unsigned char *px; // 指向存储像素的地址
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
hBmp = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);
GetObject(hBmp, sizeof(BITMAP), &bm);
px = new unsigned char[bm.bmHeight * bmWidthBytes];
GetBitmapBits(hBmp, bm.bmHeight * bm.WidthBytes, px);

#15


Y___Y(一叶障目) ( ) 信誉:100    Blog   加为好友  2007-06-18 16:19:00  得分: 0  
 
 
   取数据代码如下(要做小的修改)
HDC hdc;
HDC mdc;
BITMAP bm;
HBITMAP hBmp;
unsigned char *px; // 指向存储像素的地址
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
hBmp = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);
GetObject(hBmp, sizeof(BITMAP), &bm);
px = new unsigned char[bm.bmHeight * bmWidthBytes];
GetBitmapBits(hBmp, bm.bmHeight * bm.WidthBytes, px);
  
 
Top  
 
可是我的图像并没有存储为文件,而是在内存中

#16


有没有人可以给我一个例子,

#17


BITMAPINFOHEADER BMIH;
memset(&BMIH,0,sizeof(BITMAPINFOHEADER));
BYTE * pDrawingSurfaceBits=NULL;
BMIH.biSize=sizeof(BITMAPINFOHEADER);
BMIH.biBitCount=1;
BMIH.biPlanes=1;
BMIH.biCompression=BI_RGB;
BMIH.biWidth=27;
BMIH.biHeight=11;
BMIH.biSizeImage=((((BMIH.biWidth*BMIH.biBitCount)+31) & ~31) >>3)*BMIH.biHeight;

CDC memDC;
memDC.CreateCompatibleDC(NULL);
HBITMAP hbitmap=CreateDIBSection(memDC.GetSafeHdc(),(CONST BITMAPINFO *)&BMIH,DIB_RGB_COLORS, (void **)&pDrawingSurfaceBits,
NULL,0);
memDC.FillSolidRect(0, 0, 27, 11, RGB(255, 255, 255));
memDC.Ellipse(1, 1, 25, 9);

BYTE *pTemp = new BYTE[500];
ZeroMemory(pTemp, 500);

int nCount = GetDIBits(memDC.GetSafeHdc(), 
(HBITMAP)memDC.GetCurrentBitmap(), 0, BMIH.biHeight, 
(LPVOID)pTemp, (BITMAPINFO*)&BMIH, DIB_RGB_COLORS);


楼上的大哥大姐们,请问我这么做是正确的吗?

#18


LPBITMAPINFO 这个参数根据你创建的图像而定.
缓冲区大小根据你CreateCompatibleBitmap的时候算出来的.具体的算法我忘了,你找找吧.
你可以参考这个
http://www.vckbase.com/document/viewdoc/?id=1402

#19


BITMAPINFOHEADER BMIH;
memset(&BMIH,0,sizeof(BITMAPINFOHEADER));
BYTE * pDrawingSurfaceBits=NULL;
BMIH.biSize=sizeof(BITMAPINFOHEADER);
BMIH.biBitCount=1;
BMIH.biPlanes=1;
BMIH.biCompression=BI_RGB;
BMIH.biWidth=27;
BMIH.biHeight=11;
BMIH.biSizeImage=((((BMIH.biWidth*BMIH.biBitCount)+31) & ~31) >>3)*BMIH.biHeight;

CDC memDC;
memDC.CreateCompatibleDC(NULL);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&memDC, 27, 11);
//HBITMAP hbitmap=CreateDIBSection(memDC.GetSafeHdc(),(CONST BITMAPINFO *)&BMIH,DIB_RGB_COLORS, (void **)&pDrawingSurfaceBits, NULL,0);
memDC.SelectObject(bitmap);
memDC.FillSolidRect(0, 0, 27, 11, RGB(255, 255, 255));
memDC.Ellipse(1, 1, 25, 9);

BYTE *pTemp = new BYTE[500];
ZeroMemory(pTemp, 500);

int nCount = GetDIBits(memDC.GetSafeHdc(), 
(HBITMAP)memDC.GetCurrentBitmap(), 0, BMIH.biHeight, 
(LPVOID)pTemp, (BITMAPINFO*)&BMIH, DIB_RGB_COLORS);

我重新修改了一下代码,为什么还是取不出数据??
nCount 为0
pTemp 为0

#20


有人知道吗??

#21


在内存中这句就不要
hBmp = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);

#22


可以帮我写一个例子吗??

#23


这个我以前也问过。

#24


当时csdn上没人会啊

#1


首先创建一块内存DC:

CDC* m_pmemDC;
CBitmap* m_pmemBitmap;

m_pmemDC->CreateCompatibleDC(&dc);
m_pmemBitmap->CreateCompatibleBitmap(&dc, SHOWPICWIDTH,SHOWPICHEIGHT);    
m_pmemDC->SelectObject(m_pmemBitmap);

brush.CreateSolidBrush(RGB(255,255,255));
m_pmemDC->FillRect(&rectClient, &brush);

m_pmemDC就是你要的内存DC,你就可以在上面画了.

#2


先创建一个内存DC用CreateCompatibleDC 
然后就可以在这个DC上画图了

#3


那么,请问我画完图以后需要得到他的图像数据,我从哪里可以取得呢??

#4


DC啊.
图像画在DC上,肯定是从DC取数据啦.

#5


可以举一个例子吗??我是菜鸟,不要意思

#6


HBITMAP CreateCompatibleBitmap(
  HDC hdc,        // handle to DC
  int nWidth,     // width of bitmap, in pixels
  int nHeight     // height of bitmap, in pixels
);
这样你就有HBITMAP句柄了,就可以得到其中的数据了

#7


看看这个:http://blog.csdn.net/afxid/archive/2006/06/23/823992.aspx

#8


创建一个内存DC

画在它上面

需要的时候可以BitBlt到前台。

#9


akirya(坏[其实偶不是什么所谓的坏人]) ( ) 信誉:97    Blog   加为好友  2007-06-18 14:54:48  得分: 0  
 
 
   HBITMAP CreateCompatibleBitmap(
  HDC hdc,        // handle to DC
  int nWidth,     // width of bitmap, in pixels
  int nHeight     // height of bitmap, in pixels
);
这样你就有HBITMAP句柄了,就可以得到其中的数据了
  
请问,如果要得到图像的二进制数据也可以吗??谢谢

CathySun118(斯年) ( ) 信誉:100    Blog   加为好友  2007-06-18 14:56:44  得分: 0  
 
 
   看看这个:http://blog.csdn.net/afxid/archive/2006/06/23/823992.aspx
  
你给的例子我正在看,谢谢 

#10


LONG GetBitmapBits(
  HBITMAP hbmp,      // handle to bitmap
  LONG cbBuffer,     // number of bytes to copy
  LPVOID lpvBits     // buffer to receive bits
);

#11


int GetDIBits(
  HDC hdc,           // handle to DC
  HBITMAP hbmp,      // handle to bitmap
  UINT uStartScan,   // first scan line to set
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // array for bitmap bits
  LPBITMAPINFO lpbi, // bitmap data buffer
  UINT uUsage        // RGB or palette index
);

lpvBits 
[out] Pointer to a buffer to receive the bitmap data. If this parameter is NULL, the function passes the dimensions and format of the bitmap to the BITMAPINFO structure pointed to by the lpbi parameter. 
lpbi 
[in/out] Pointer to a BITMAPINFO structure that specifies the desired format for the DIB data.

#12


akirya(坏[其实偶不是什么所谓的坏人]) ( ) 信誉:97    Blog   加为好友  2007-6-18 15:12:13  得分: 0  
 
 
   
int GetDIBits(
  HDC hdc,           // handle to DC
  HBITMAP hbmp,      // handle to bitmap
  UINT uStartScan,   // first scan line to set
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // array for bitmap bits
  LPBITMAPINFO lpbi, // bitmap data buffer
  UINT uUsage        // RGB or palette index
);

lpvBits 
[out] Pointer to a buffer to receive the bitmap data. If this parameter is NULL, the function passes the dimensions and format of the bitmap to the BITMAPINFO structure pointed to by the lpbi parameter. 
lpbi 
[in/out] Pointer to a BITMAPINFO structure that specifies the desired format for the DIB data.

  
 
很感谢你的耐心回复,
我现在有GetDIBits 将数据读取到BYTE *pTemp中,可是这个*pTemp大小我该怎么获取呢??

#13


同时 LPBITMAPINFO lpbi, // bitmap data buffer,该如何设置呢??

#14


取数据代码如下(要做小的修改)
HDC hdc;
HDC mdc;
BITMAP bm;
HBITMAP hBmp;
unsigned char *px; // 指向存储像素的地址
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
hBmp = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);
GetObject(hBmp, sizeof(BITMAP), &bm);
px = new unsigned char[bm.bmHeight * bmWidthBytes];
GetBitmapBits(hBmp, bm.bmHeight * bm.WidthBytes, px);

#15


Y___Y(一叶障目) ( ) 信誉:100    Blog   加为好友  2007-06-18 16:19:00  得分: 0  
 
 
   取数据代码如下(要做小的修改)
HDC hdc;
HDC mdc;
BITMAP bm;
HBITMAP hBmp;
unsigned char *px; // 指向存储像素的地址
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
hBmp = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);
GetObject(hBmp, sizeof(BITMAP), &bm);
px = new unsigned char[bm.bmHeight * bmWidthBytes];
GetBitmapBits(hBmp, bm.bmHeight * bm.WidthBytes, px);
  
 
Top  
 
可是我的图像并没有存储为文件,而是在内存中

#16


有没有人可以给我一个例子,

#17


BITMAPINFOHEADER BMIH;
memset(&BMIH,0,sizeof(BITMAPINFOHEADER));
BYTE * pDrawingSurfaceBits=NULL;
BMIH.biSize=sizeof(BITMAPINFOHEADER);
BMIH.biBitCount=1;
BMIH.biPlanes=1;
BMIH.biCompression=BI_RGB;
BMIH.biWidth=27;
BMIH.biHeight=11;
BMIH.biSizeImage=((((BMIH.biWidth*BMIH.biBitCount)+31) & ~31) >>3)*BMIH.biHeight;

CDC memDC;
memDC.CreateCompatibleDC(NULL);
HBITMAP hbitmap=CreateDIBSection(memDC.GetSafeHdc(),(CONST BITMAPINFO *)&BMIH,DIB_RGB_COLORS, (void **)&pDrawingSurfaceBits,
NULL,0);
memDC.FillSolidRect(0, 0, 27, 11, RGB(255, 255, 255));
memDC.Ellipse(1, 1, 25, 9);

BYTE *pTemp = new BYTE[500];
ZeroMemory(pTemp, 500);

int nCount = GetDIBits(memDC.GetSafeHdc(), 
(HBITMAP)memDC.GetCurrentBitmap(), 0, BMIH.biHeight, 
(LPVOID)pTemp, (BITMAPINFO*)&BMIH, DIB_RGB_COLORS);


楼上的大哥大姐们,请问我这么做是正确的吗?

#18


LPBITMAPINFO 这个参数根据你创建的图像而定.
缓冲区大小根据你CreateCompatibleBitmap的时候算出来的.具体的算法我忘了,你找找吧.
你可以参考这个
http://www.vckbase.com/document/viewdoc/?id=1402

#19


BITMAPINFOHEADER BMIH;
memset(&BMIH,0,sizeof(BITMAPINFOHEADER));
BYTE * pDrawingSurfaceBits=NULL;
BMIH.biSize=sizeof(BITMAPINFOHEADER);
BMIH.biBitCount=1;
BMIH.biPlanes=1;
BMIH.biCompression=BI_RGB;
BMIH.biWidth=27;
BMIH.biHeight=11;
BMIH.biSizeImage=((((BMIH.biWidth*BMIH.biBitCount)+31) & ~31) >>3)*BMIH.biHeight;

CDC memDC;
memDC.CreateCompatibleDC(NULL);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&memDC, 27, 11);
//HBITMAP hbitmap=CreateDIBSection(memDC.GetSafeHdc(),(CONST BITMAPINFO *)&BMIH,DIB_RGB_COLORS, (void **)&pDrawingSurfaceBits, NULL,0);
memDC.SelectObject(bitmap);
memDC.FillSolidRect(0, 0, 27, 11, RGB(255, 255, 255));
memDC.Ellipse(1, 1, 25, 9);

BYTE *pTemp = new BYTE[500];
ZeroMemory(pTemp, 500);

int nCount = GetDIBits(memDC.GetSafeHdc(), 
(HBITMAP)memDC.GetCurrentBitmap(), 0, BMIH.biHeight, 
(LPVOID)pTemp, (BITMAPINFO*)&BMIH, DIB_RGB_COLORS);

我重新修改了一下代码,为什么还是取不出数据??
nCount 为0
pTemp 为0

#20


有人知道吗??

#21


在内存中这句就不要
hBmp = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);

#22


可以帮我写一个例子吗??

#23


这个我以前也问过。

#24


当时csdn上没人会啊