保存文件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