保存文件
void SaveFile(char* name,MYBITMAP* m){
CFile file(name,CFile::modeWrite|CFile::modeCreate);
file.Write(m->bmphdr,sizeof(BITMAPFILEHEADER));
file.Write(m->lpbmp,sizeof(BITMAPINFOHEADER));
file.WriteHuge(m->palette,m->len);
file.WriteHuge(m->data,WIDTHBYTES(m->lpbmp->biWidth*8)*m->lpbmp->biHeight);
file.Close();
}
灰度化
BOOL Gray(MYBITMAP* &myb){
BITMAPFILEHEADER *bfh=(myb->bmphdr); BITMAPINFOHEADER *bih=(myb->lpbmp); int lw=WIDTHBYTES(bih->biWidth*8); int lh=bih->biHeight; bfh->bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+lw*bih->biHeight+256*4; bfh->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4; bih->biBitCount=8; bih->biClrUsed=256; bih->biClrImportant=0; bih->biSizeImage=lw*lh; //创建调色板 BYTE * pal = new BYTE[256*4]; memset(pal,0,256*4); for(int i=0;i<256;i++){ pal[i*4]=i; pal[i*4+1]=i; pal[i*4+2]=i; } if(myb->palette!=NULL){ delete myb->palette; } myb->palette=pal; myb->len=256*4; //修改数据 LPBYTE data = new BYTE[lw*lh]; for(int j=0;j<lh;j++){ for(int k=0;k<bih->biWidth;k++){ double r=myb->data[(j*bih->biWidth+k)*3]; double g=myb->data[(j*bih->biWidth+k)*3+1]; double b=myb->data[(j*bih->biWidth+k)*3+2]; data[j*bih->biWidth+k]=0.3*r+0.59*g+0.11*b; } } delete myb->data; myb->data=data; return 0; } //自定义位图格式 typedef struct mybitmay{ BITMAPFILEHEADER *bmphdr;//文件头 BITMAPINFOHEADER *lpbmp;//文件信息头] LPBYTE palette;//调色板 int len;//调色板长度 LPBYTE data;//文件数据 }MYBITMAP;
MYBITMAP *AttachFromName(LPCTSTR lpcPathName);//打开图片文件
MYBITMAP *AttachFromFile(CFile &file);//得到位图信息
#endif
BOOL Gray(MYBITMAP* &myb);//灰度化
BOOL PaintDIB(HDC hDC,RECT des,RECT src, MYBITMAP myb);//在屏幕上画图
void SaveFile(char* name,MYBITMAP* m);
HPALETTE GetPalette(MYBITMAP* m);
MYBITMAP *AttachFromName(LPCTSTR lpcPathName)//打开文件
{
CFile file;
if(!file.Open(lpcPathName,CFile::modeRead))
return 0;
return AttachFromFile(file);
}
MYBITMAP *AttachFromFile(CFile &file)//得到图片信息
{
LPBYTE lpData;
BITMAPINFOHEADER *pBMIH;
LPVOID lpvColorTable;
int nColorTableEntries;
BITMAPFILEHEADER *bmfHeader=(BITMAPFILEHEADER*)malloc(sizeof( BITMAPFILEHEADER));
if(!file.Read(bmfHeader,sizeof(BITMAPFILEHEADER)))
{
return FALSE;
}
if(bmfHeader->bfType!=MAKEWORD('B','M'))
{
return FALSE;
}
pBMIH=(BITMAPINFOHEADER*)malloc(bmfHeader->bfOffBits-sizeof(BITMAPFILEHEADER));
if(!file.Read(pBMIH,bmfHeader->bfOffBits-sizeof(BITMAPFILEHEADER)))//文件信息头
{
delete pBMIH;
return FALSE;
}
nColorTableEntries=(bmfHeader->bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER))/sizeof(RGBQUAD);
if(nColorTableEntries>0)
{
lpvColorTable=pBMIH+1;
}
int nWidthBytes=WIDTHBYTES((pBMIH->biWidth)*pBMIH->biBitCount);
lpData=new BYTE[pBMIH->biHeight*nWidthBytes*3];
printf("nWidthBytes:%d,biWidth:%d\n",nWidthBytes,pBMIH->biWidth);
file.ReadHuge(lpData,pBMIH->biHeight*nWidthBytes*3);
MYBITMAP *m = new MYBITMAP;
m->bmphdr=bmfHeader;
m->lpbmp=pBMIH;
if(pBMIH->biClrUsed==0){
m->palette=0;
m->len=0;
}
m->data=lpData;
return m;
}
显示在程序上
BOOL PaintDIB(HDC hDC,RECT des,RECT src, MYBITMAP myb){
BITMAPINFOHEADER* lpDIBHdr; // BITMAPINFOHEADER指针
BOOL bSuccess=FALSE; // 成功标志
HPALETTE hPal=NULL; // DIB调色板
HPALETTE hOldPal=NULL; // 以前的调色板
lpDIBHdr = myb.lpbmp;
int lw=WIDTHBYTES(myb.lpbmp->biWidth*8);
hPal=GetPalette(&myb);
if (hPal != NULL)
{
// 选中调色板
hOldPal = ::SelectPalette(hDC, hPal, FALSE);
}
// 设置显示模式
::SetStretchBltMode(hDC, COLORONCOLOR);
int bw =myb.lpbmp->biWidth;
int bh = myb.lpbmp->biHeight;
// 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
if(des.right-des.left>=(src.right-src.left)&&
(des.bottom-des.top)>=(src.bottom-src.top)
)
{
// 原始大小,不用拉伸。
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
0 , // DestX
0 , // DestY
bw , // nDestWidth
bh, // nDestHeight
0, // SrcX
0, // SrcY
0, // nStartScan
bh, // nNumScans
myb.data, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS
); // wUsage
}
else
{
// 非原始大小,拉伸。
bSuccess = StretchDIBits(hDC, // hDC
des.left , // DestX
des.top , // DestY
des.right , // nDestWidth
des.bottom, // nDestHeight
src.left, // SrcX
src.top, // SrcY
src.right, // nStartScan
src.bottom, // nNumScans
myb.data, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS,
SRCCOPY
); // wUsage
}
// 解除锁定
// 恢复以前的调色板
if (hOldPal != NULL)
{
::SelectPalette(hDC, hOldPal, TRUE);
}
// 返回
return bSuccess;
}
//调色板设置
HPALETTE GetPalette(MYBITMAP* m){
HPALETTE hPal=0;
if(m->len!=0){
LOGPALETTE *lpLogPalette=(LOGPALETTE*)new BYTE[sizeof(LOGPALETTE)+255*sizeof(PALETTEENTRY)];
lpLogPalette->palVersion=0x300;
lpLogPalette->palNumEntries=256;
// lpLogPalette->palPalEntry =new PALETTEENTRY[256];
for(int i=0;i<256;i++){
PALETTEENTRY entry={i,i,i,0};
lpLogPalette->palPalEntry[i]=entry;
}
//memcpy(a+4,myb.palette,256*4);
hPal=CreatePalette(lpLogPalette);
delete lpLogPalette;
}
return hPal;
}
这里有Jpg与bmp之转换的dll