奇怪,我以前用类似代码就不行,楼主说的那个东西其实就是一个数组,但是我没有试成功过,
是利用BITMAPINFO结构,你说的那个pData也是它的一个成员,这个结构好象在windows单元里面
下面转贴一个VC的代码
http://www.ccw.com.cn/htm/produ/special/vc/neimu/01_9_17_40.asp
// MyBmp.h: interface for the MyBmp class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MYBMP_H__34151075_C57B_11D1_94F8_0000B431BBA1__INCLUDED_)
#define AFX_MYBMP_H__34151075_C57B_11D1_94F8_0000B431BBA1__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#define FALSERETURN {_lclose(hFile);return 0;}
#define IMAGECOLORS(x,y) (1<<((x)*
![Thumbs up (y) (y)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f44d.png)
))
//单行BMP数据的字节数
#define DWORD_WBYTES(x) ((((x)+31UL)>>5)<<2)
#define min(a, b) (((a) < (b)) ? (a) : (b))
#ifdef WIN32
#define BMPDATA BYTE
#else
#define BMPDATA BYTE _huge
#endif
// #include "test.cpp"
#define PALVERSION 0x0300
#define DIB_STORAGEWIDTH(x) ((x + 3) & ~3)
#define WIDTHBYTES(i) ((i+31)/32*4)
#define MAXPALETTE 256 /* max. # supported palette entries */
#define MAXLOADFLCNUMBER 255
class PALETTE
{
private:
HPALETTE hOldPal;
protected:
HPALETTE hPal;
public:
PALETTE(){memset(this,0,sizeof(PALETTE));}
~PALETTE(){if(hPal)DeleteObject(hPal);};
HPALETTE CreatePal(BITMAPINFO*);
HPALETTE CreatePal(LPLOGPALETTE Pal);
HPALETTE GetPal(){return hPal;}
UINT SetPal(HDC);
void ResetPal(HDC);
};
class MYDIB : public PALETTE
{
protected:
HGLOBAL hData;
struct
{
BITMAPINFOHEADER b;
RGBQUAD r[256];
}p;
public:
LPBITMAPINFO lpInfo;
LPBITMAPINFOHEADER lpInfoHead;
MYDIB();
~MYDIB();
int Show(HDC,int,int,int,int,int,int,int,int,DWORD);
inline int Show(HDC hDC,int x1,int y1,int x2,int y2,
int x3,int y3,int x4,int y4)
{ return Show(hDC,x1,y1,x2,y2,x3,y3,x4,y4,SRCCOPY);}
inline int Show(HDC hDC,int x,int y)
{ return Show(hDC,x,y,0,0,0,0,0,0,SRCCOPY);}
inline int Show(HDC hDC)
{ return Show(hDC,0,0,0,0,0,0,0,0,SRCCOPY);}
Show(MYDIB*,int,int,int,int,int,int,BYTE,BYTE,BYTE,
BYTE,BYTE,BYTE);
Show(MYDIB*,int,int,int,int,int,int,register
BYTE,register BYTE);
};
class BMP : public MYDIB
{
public:
int Open(LPCSTR,int);
int inline Open(LPCSTR name){return Open(name,0);}
};
#endif // !defined(AFX_MYBMP_H__34151075_C57B_11D1_94F8_0000B431BBA1__INCLUDED_)
// MyBmp.cpp: implementation of the MyBmp class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyBmp.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//class PALETTE
//////////////////////////////////////////////////////////////////////
UINT PALETTE::SetPal(HDC hDC)
{
if(hPal)
{
SelectPalette(hDC,hPal,0);
return RealizePalette(hDC);
}
else return FALSE;
}
void PALETTE::ResetPal(HDC hDC)
{
if(hOldPal)
{
SelectPalette(hDC,hOldPal,0);
hOldPal=0;
}
}
HPALETTE PALETTE::CreatePal(LPLOGPALETTE Pal)
{
if(hPal)DeleteObject(hPal);
if(Pal_>palNumEntries<=256)hPal=CreatePalette(Pal);
return hPal;
}
//////////////////////////////////////////////////////////////////////
//class DIBPALETTE
//////////////////////////////////////////////////////////////////////
HPALETTE PALETTE::CreatePal(BITMAPINFO* info)
{
struct
{
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[256];
} p;
LPLOGPALETTE Pal=(LPLOGPALETTE)&p;
Pal_>palVersion=0x300;
Pal_>palNumEntries=
/*min*/((WORD)IMAGECOLORS(info_>bmiHeader.biBitCount,1));//,info_>bmiHeader.biClrUsed);
for(int i=0;i<Pal_>palNumEntries;i++)
{
Pal_>palPalEntry
.peRed=info_>bmiColors.rgbRed;
Pal_>palPalEntry.peGreen=
info_>bmiColors.rgbGreen;
Pal_>palPalEntry.peBlue=info_>bmiColors.rgbBlue;
Pal_>palPalEntry.peFlags =PC_NOCOLLAPSE;
}
return PALETTE::CreatePal(Pal);
}
//////////////////////////////////////////////////////////////////////
// MYDIB Class
//////////////////////////////////////////////////////////////////////
MYDIB::MYDIB()
{
memset(this,0,sizeof(BMP));
lpInfo=(LPBITMAPINFO)&p;
lpInfoHead=(LPBITMAPINFOHEADER)&p;
}
MYDIB::~MYDIB()
{
if(hData)GlobalFree(hData);
}
int MYDIB::Show(HDC hDC,int x1,int y1,int x2,int y2,int x3,
int y3,int x4,int y4,DWORD Rop)
{
if(x2<=0)x2=(int)lpInfoHead_>biWidth+x2;
if(y2<=0)y2=(int)lpInfoHead_>biHeight+y2;
if(x4<=0)x4=(int)lpInfoHead_>biWidth+x4;
if(y4<=0)y4=(int)lpInfoHead_>biHeight+y4;
// if(w_hp)SetPalette(hDC);
BMPDATA* Data=(BMPDATA*)GlobalLock(hData);
// int i=StretchDIBits(hDC,x1,y1,x2,y2,x3,y3,x4,y4,
Data,Info,DIB_RGB_COLORS,Rop);
int i=StretchDIBits(hDC,x1,y1,x2,y2,x3,
(int)lpInfoHead_>biHeight_y3_y4,x4,y4,Data,lpInfo,
DIB_RGB_COLORS,Rop);
GlobalUnlock(hData);
return i;
}
int MYDIB::Show(MYDIB* dib,int x1,int y1,int x2,int y2,int x3,int y3,
BYTE r1,BYTE g1,BYTE b1,BYTE r2,BYTE g2,BYTE b2)
{
register DWORD c1=(((DWORD)r1)<<16)+(((DWORD)g1)<<8)+b1;
register DWORD c2=(((DWORD)r2)<<16)+(((DWORD)g2)<<8)+b2;
register DWORD c;
register DWORD *rq=(DWORD*)p.r;
if(!dib_>hData)
{
memcpy(dib,this,sizeof(MYDIB));
dib_>lpInfo=(LPBITMAPINFO)&(dib_>p);
dib_>lpInfoHead=(LPBITMAPINFOHEADER)&(dib_>p);
dib_>lpInfoHead_>biWidth =x2+x1;
dib_>lpInfoHead_>biHeight =y2+y1;
DWORD Size=dib_>lpInfoHead_>biWidth
*dib_>lpInfoHead_>biHeight
*IMAGECOLORS(dib_>lpInfoHead_>biBitCount,1)/8;
dib_>hData=GlobalAlloc(GMEM_FIXED,Size);
}
x2=min(x2,(int)dib_>lpInfoHead_>biWidth _x1);
y2=min(y2,(int)dib_>lpInfoHead_>biHeight_y1);
BMPDATA *Data1=(BMPDATA*)GlobalLock(hData);
BMPDATA *Data2=(BMPDATA*)GlobalLock(dib_>hData);
DWORD w1=DWORD_WBYTES(lpInfoHead_>biWidth
*lpInfoHead_>biBitCount);
DWORD w2=DWORD_WBYTES(dib_>lpInfoHead_>biWidth
*dib_>lpInfoHead_>biBitCount);
Data1+=(w1*(lpInfoHead_>biHeight_y3_y2)
+x3*lpInfoHead_>biBitCount/8);
Data2+=(w2*(dib_>lpInfoHead_>biHeight_y1_y2)
+x1*dib_>lpInfoHead_>biBitCount/8);
for(int j=0;j<y2;j++)
{
for(register int i=0;i<x2;i++)
{
c=*(rq+*(Data1+i));
if( (c<c1)|| (c>c2)||((WORD)c<(WORD)c1)
|| ((WORD)c>(WORD)c2)
|| ((BYTE)c<(BYTE)c1)
||((BYTE)c>(BYTE)c2)) *(Data2+i)=*(Data1+i);
}
Data1+=w1;
Data2+=w2;
}
GlobalUnlock(hData);
GlobalUnlock(dib_>hData);
return TRUE;
}
int MYDIB::Show(MYDIB* dib,int x1,int y1,int x2,int y2,int x3,
int y3,register BYTE x,register BYTE y)
{
register BMPDATA d;
if(!dib_>hData)
{
memcpy(dib,this,sizeof(MYDIB));
dib_>lpInfo=(LPBITMAPINFO)&(dib_>p);
dib_>lpInfoHead=(LPBITMAPINFOHEADER)&(dib_>p);
dib_>lpInfoHead_>biWidth =x2+x1;
dib_>lpInfoHead_>biHeight =y2+y1;
DWORD Size=(dib_>lpInfoHead_>biWidth+1)
*dib_>lpInfoHead_>biHeight
*dib_>lpInfoHead_>biBitCount/8;
//IMAGECOLORS(dib_>lpInfoHead_>biBitCount,1)/8;
dib_>hData=GlobalAlloc(GMEM_FIXED,Size);
}
x2=min(x2,(int)dib_>lpInfoHead_>biWidth _x1);
y2=min(y2,(int)dib_>lpInfoHead_>biHeight_y1);
BMPDATA *Data1=(BMPDATA*)GlobalLock(hData);
BMPDATA *Data2=(BMPDATA*)GlobalLock(dib_>hData);
DWORD w1=DWORD_WBYTES(lpInfoHead_>biWidth
*lpInfoHead_>biBitCount);
DWORD w2=DWORD_WBYTES(dib_>lpInfoHead_>biWidth
*dib_>lpInfoHead_>biBitCount);
Data1+=(w1*(lpInfoHead_>biHeight_y3_y2)
+x3*lpInfoHead_>biBitCount/8);
Data2+=(w2*(dib_>lpInfoHead_>biHeight_y1_y2)
+x1*dib_>lpInfoHead_>biBitCount/8);
for(int j=0;j<y2;j++)
{
for(register int i=0;i<x2;i++)
{
d=*(Data1+i);
if((d<x)||(d>y))*(Data2+i)=d;
}
Data1+=w1;
Data2+=w2;
}
GlobalUnlock(hData);
GlobalUnlock(dib_>hData);
return TRUE;
}
//////////////////////////////////////////////////////////////////////
//class bmp
//////////////////////////////////////////////////////////////////////
int BMP::Open(LPCSTR File,int sty) //sty: 0:enable hpal 1:disnnable hpal
{
BITMAPFILEHEADER FileHead;
int i;//,j,k;
HFILE hFile;
DWORD uBytes;
DWORD Size;
hFile=_lopen(File,OF_READ);
if(hFile==HFILE_ERROR)return 0;
//读取文件头
i=_lread(hFile,&FileHead,sizeof(BITMAPFILEHEADER));
if(i==HFILE_ERROR) FALSERETURN;//goto BMP_FALSE_END;
// Type=FileHead.bfType;
//读取信息头
i=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
_lread(hFile,lpInfoHead,i);
//建立调色板
if(!sty)CreatePal(lpInfo);
uBytes=_llseek(hFile,0,2);
if ((FileHead.bfSize)>uBytes) FALSERETURN;//goto BMP_FALSE_END;
if(hData)GlobalFree(hData);
Size=uBytes_FileHead.bfOffBits;
hData=GlobalAlloc(GMEM_FIXED,Size);
BMPDATA * Data=(BMPDATA*)GlobalLock(hData);
//读取数据
_llseek(hFile,FileHead.bfOffBits,0);
for(;_lread(hFile,Data,RBLOCK)==RBLOCK;Data+=RBLOCK);
GlobalUnlock(hData);
_lclose(hFile);
return TRUE;
}