跪求从bmp文件读取,转弯成灰度图的VC程序 麻烦了,我对vc刚摸,不大懂,老师又让我做这个,用vc,谢谢了,可以发到我邮箱:[email protected]感激感激!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include <windows.h>//全局變量#define WIDTHBYTES(i) ((i+31)/32*4)BITMAPFILEHEADER bf;BITMAPINFOHEADER bi;HPALETTE hPalette=NULL;HBITMAP hBitmap=NULL;HGLOBAL hImgData=NULL;DWORD NumColors;DWORD LineBytes;HINSTANCE ghInst;DWORD ImgWidth=0 , ImgHeight=0;int GrayTable[256];int MaxGrayNum;int MinGrayNum;int FirstPoint=0, SecondPoint=255;float StretchRatio=2.0f;int EquaScale;BOOL LoadBmpFile(LPCSTR BmpFileName){ HFILE hf; LPBITMAPINFOHEADER lpImgData; LOGPALETTE *pPal; LPRGBQUAD lpRGB; HPALETTE hPrevPalette; HDC hDc; HLOCAL hPal; DWORD ImgSize; DWORD i; if ((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR) { MessageBox(NULL,"Can not Load file","Error",MB_OK|MB_ICONEXCLAMATION); return FALSE; } _lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); _lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER)); ImgWidth=bi.biWidth; ImgHeight=bi.biHeight; LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); ImgSize=(DWORD)LineBytes*bi.biHeight; if (bi.biClrUsed!=0) NumColors=(DWORD)bi.biClrUsed; else switch (bi.biBitCount) { case 1: NumColors=2; break; case 4: NumColors=16; break; case 8: NumColors=256; break; case 24: NumColors=0; break; case 32: NumColors=0; break; default: MessageBox(0,"Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION); _lclose(hf); return FALSE; NumColors = 0; break; } if (bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER))) { MessageBox(0,"Invalid color numbers!","Error Message" ,MB_OK| MB_ICONEXCLAMATION); _lclose(hf); return FALSE; } bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize; if ((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+ NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL) { MessageBox(0,"Error alloc memory!","ErrorMessage",MB_OK| MB_ICONEXCLAMATION); _lclose(hf); return FALSE; } lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); _llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN); _hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER) +(long)NumColors*sizeof(RGBQUAD)+ImgSize); _lclose(hf); if (NumColors!=0) { hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY)); pPal =(LOGPALETTE *)LocalLock(hPal); pPal->palNumEntries =(WORD) NumColors; pPal->palVersion = 0x300; lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER)); for (i = 0; i < NumColors; i++) { pPal->palPalEntry[i].peRed=lpRGB->rgbRed; pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen; pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue; pPal->palPalEntry[i].peFlags=(BYTE)0; lpRGB++; } hPalette=CreatePalette(pPal); LocalUnlock(hPal); LocalFree(hPal); } hDc=/*::*/GetDC(0/*m_hWnd*/); if (hPalette) { hPrevPalette=SelectPalette(hDc,hPalette,FALSE); RealizePalette(hDc); } hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS); if (hPalette && hPrevPalette) { SelectPalette(hDc,hPrevPalette,FALSE); RealizePalette(hDc); } /*::*/ReleaseDC(0/*m_hWnd*/,hDc); GlobalUnlock(hImgData); //GetDocument()->SetTitle( BmpFileName ); return TRUE;}// continue ... BOOL ColorToGray(LPCSTR BmpFileName){ DWORD SrcBufSize,DstBufSize,DstLineBytes; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; HDC hDc; HFILE hf; LONG x,y; BITMAPFILEHEADER DstBf; BITMAPINFOHEADER DstBi; LOGPALETTE *pPal; HPALETTE hPrevPalette; HLOCAL hPal; DWORD NewNumColors; WORD NewBitCount; float Y; DWORD i; unsigned char Red,Green,Blue,Gray; NewNumColors=NumColors; NewBitCount=bi.biBitCount; if (NumColors==0) //true color { NewNumColors=256; NewBitCount=8; } DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount); DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight); memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER)); memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER)); DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER); DstBf.bfOffBits=(DWORD)(NewNumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER)); DstBi.biClrUsed=0; DstBi.biBitCount=NewBitCount; SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER); if ((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL) { MessageBox(0,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION); return FALSE; } lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //copy image data memcpy(lpTempImgData,lpImgData,DstBufSize); //overwrite bitmapinfoheader with the new one memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER)); lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER); lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER); hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NewNumColors* sizeof(PALETTEENTRY)); pPal =(LOGPALETTE *)LocalLock(hPal); pPal->palNumEntries =(WORD) NewNumColors; pPal->palVersion = 0x300; if (NumColors==0) //true color for (i = 0; i < 256; i++) { pPal->palPalEntry[i].peRed=(BYTE)i; pPal->palPalEntry[i].peGreen=(BYTE)i; pPal->palPalEntry[i].peBlue=(BYTE)i; pPal->palPalEntry[i].peFlags=(BYTE)0; *(lpTempPtr++)=(unsigned char)i; *(lpTempPtr++)=(unsigned char)i; *(lpTempPtr++)=(unsigned char)i; *(lpTempPtr++)=0; } else for (i = 0; i < NewNumColors; i++) { Blue=(unsigned char )(*lpPtr++); Green=(unsigned char )(*lpPtr++); Red=(unsigned char )(*lpPtr++); Y=(float)(Red*0.299+Green*0.587+Blue*0.114); Gray=(BYTE)Y; lpPtr++; pPal->palPalEntry[i].peRed=Gray; pPal->palPalEntry[i].peGreen=Gray; pPal->palPalEntry[i].peBlue=Gray; pPal->palPalEntry[i].peFlags=0; *(lpTempPtr++)=(unsigned char)Gray; *(lpTempPtr++)=(unsigned char)Gray; *(lpTempPtr++)=(unsigned char)Gray; *(lpTempPtr++)=0; } if (hPalette!=NULL) DeleteObject(hPalette); hPalette=CreatePalette(pPal); LocalUnlock(hPal); LocalFree(hPal); hDc=/*::*/GetDC(0/*m_hWnd*/); if (hPalette) { hPrevPalette=SelectPalette(hDc,hPalette,FALSE); RealizePalette(hDc); } if (NumColors==0) for (y=0;y<bi.biHeight;y++) { lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes); lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y*DstLineBytes); for (x=0;x<bi.biWidth;x++) { Blue=(unsigned char )(*lpPtr++); Green=(unsigned char )(*lpPtr++); Red=(unsigned char )(*lpPtr++); Y=(float)(Red*0.299+Green*0.587+Blue*0.114); Gray=(BYTE)Y; *(lpTempPtr++)=(unsigned char)Gray; } } if (hBitmap!=NULL) DeleteObject(hBitmap); hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT, (LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NewNumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS); if (hPalette && hPrevPalette) { SelectPalette(hDc,hPrevPalette,FALSE); RealizePalette(hDc); } hf=_lcreat(BmpFileName,0); _lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); _lwrite(hf,(LPSTR)lpTempImgData,DstBufSize); _lclose(hf); /*::*/ReleaseDC(0/*m_hWnd*/,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE;}int main (int argc,char **argv){//Usage: if (LoadBmpFile("f:\\Test.bmp")) { ColorToGray("f:\\Gray.bmp"); } return 0;} 你们老师很菜...出这么简单的题目..一个API调用而已 你们老师很菜...出这么简单的题目..一个API调用而已=============================真的啊,什么API啊,写出来吧 homework贴,随便去网上找找代码吧,太多了 vc读取数据库中字段时出错 实习了俩个月 我要做决定了 一个老贴子。收益具大!! 子窗口的重绘问题 , 诡异。 一个创建xml文件的问题 谁给解释一下这段程序的作用 我有一个关于监视屏幕,不段的抓取刷新区域的代码,可惜看不懂,谁能帮忙解释一下,我保证给500分! 如何在MDI中使窗口“层叠”或“平铺”使用自己的工具按钮。 初学vc,请问trace宏在debug中怎么无法显示丫 我想vc的Output窗口按键的时候,会发出咚咚的声音,这个是用了啥函数才发出咚咚的声音? 有个VC.NET的类转VC6的问题 vc 多文档界面如何实现初始打开多个工作区,类似vc开发环境
#define WIDTHBYTES(i) ((i+31)/32*4)
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
HPALETTE hPalette=NULL;
HBITMAP hBitmap=NULL;
HGLOBAL hImgData=NULL;
DWORD NumColors;
DWORD LineBytes;
HINSTANCE ghInst;
DWORD ImgWidth=0 , ImgHeight=0;
int GrayTable[256];
int MaxGrayNum;
int MinGrayNum;
int FirstPoint=0, SecondPoint=255;
float StretchRatio=2.0f;
int EquaScale;BOOL LoadBmpFile(LPCSTR BmpFileName)
{
HFILE hf;
LPBITMAPINFOHEADER lpImgData;
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HDC hDc;
HLOCAL hPal;
DWORD ImgSize;
DWORD i; if ((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR)
{
MessageBox(NULL,"Can not Load file","Error",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER));
ImgWidth=bi.biWidth;
ImgHeight=bi.biHeight;
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);
ImgSize=(DWORD)LineBytes*bi.biHeight;
if (bi.biClrUsed!=0)
NumColors=(DWORD)bi.biClrUsed;
else
switch (bi.biBitCount)
{
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0;
break;
case 32:
NumColors=0;
break;
default:
MessageBox(0,"Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
NumColors = 0;
break;
} if (bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)))
{
MessageBox(0,"Invalid color numbers!","Error Message" ,MB_OK|
MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
} bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if ((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
MessageBox(0,"Error alloc memory!","ErrorMessage",MB_OK|
MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
} lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
_llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);
_hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER)
+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
_lclose(hf);
if (NumColors!=0)
{
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY));
pPal =(LOGPALETTE *)LocalLock(hPal);
pPal->palNumEntries =(WORD) NumColors;
pPal->palVersion = 0x300;
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER));
for (i = 0; i < NumColors; i++)
{
pPal->palPalEntry[i].peRed=lpRGB->rgbRed;
pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen;
pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue;
pPal->palPalEntry[i].peFlags=(BYTE)0;
lpRGB++;
}
hPalette=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal);
}
hDc=/*::*/GetDC(0/*m_hWnd*/);
if (hPalette)
{
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
}
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData, DIB_RGB_COLORS);
if (hPalette && hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
} /*::*/ReleaseDC(0/*m_hWnd*/,hDc);
GlobalUnlock(hImgData);
//GetDocument()->SetTitle( BmpFileName );
return TRUE;
}// continue ...
BOOL ColorToGray(LPCSTR BmpFileName)
{
DWORD SrcBufSize,DstBufSize,DstLineBytes;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
BITMAPFILEHEADER DstBf;
BITMAPINFOHEADER DstBi;
LOGPALETTE *pPal;
HPALETTE hPrevPalette;
HLOCAL hPal;
DWORD NewNumColors;
WORD NewBitCount;
float Y;
DWORD i;
unsigned char Red,Green,Blue,Gray; NewNumColors=NumColors;
NewBitCount=bi.biBitCount;
if (NumColors==0) //true color
{
NewNumColors=256;
NewBitCount=8;
} DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);
DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight);
memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));
memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));
DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);
DstBf.bfOffBits=(DWORD)(NewNumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER));
DstBi.biClrUsed=0;
DstBi.biBitCount=NewBitCount; SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER); if ((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)
{
MessageBox(0,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
} lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //copy image data
memcpy(lpTempImgData,lpImgData,DstBufSize);
//overwrite bitmapinfoheader with the new one
memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER)); lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);
lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER); hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NewNumColors* sizeof(PALETTEENTRY));
pPal =(LOGPALETTE *)LocalLock(hPal);
pPal->palNumEntries =(WORD) NewNumColors;
pPal->palVersion = 0x300; if (NumColors==0) //true color
for (i = 0; i < 256; i++)
{
pPal->palPalEntry[i].peRed=(BYTE)i;
pPal->palPalEntry[i].peGreen=(BYTE)i;
pPal->palPalEntry[i].peBlue=(BYTE)i;
pPal->palPalEntry[i].peFlags=(BYTE)0;
*(lpTempPtr++)=(unsigned char)i;
*(lpTempPtr++)=(unsigned char)i;
*(lpTempPtr++)=(unsigned char)i;
*(lpTempPtr++)=0;
}
else
for (i = 0; i < NewNumColors; i++)
{
Blue=(unsigned char )(*lpPtr++);
Green=(unsigned char )(*lpPtr++);
Red=(unsigned char )(*lpPtr++);
Y=(float)(Red*0.299+Green*0.587+Blue*0.114);
Gray=(BYTE)Y;
lpPtr++;
pPal->palPalEntry[i].peRed=Gray;
pPal->palPalEntry[i].peGreen=Gray;
pPal->palPalEntry[i].peBlue=Gray;
pPal->palPalEntry[i].peFlags=0;
*(lpTempPtr++)=(unsigned char)Gray;
*(lpTempPtr++)=(unsigned char)Gray;
*(lpTempPtr++)=(unsigned char)Gray;
*(lpTempPtr++)=0;
} if (hPalette!=NULL)
DeleteObject(hPalette); hPalette=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal); hDc=/*::*/GetDC(0/*m_hWnd*/);
if (hPalette)
{
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
} if (NumColors==0)
for (y=0;y<bi.biHeight;y++)
{
lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);
lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y*DstLineBytes);
for (x=0;x<bi.biWidth;x++)
{
Blue=(unsigned char )(*lpPtr++);
Green=(unsigned char )(*lpPtr++);
Red=(unsigned char )(*lpPtr++);
Y=(float)(Red*0.299+Green*0.587+Blue*0.114);
Gray=(BYTE)Y;
*(lpTempPtr++)=(unsigned char)Gray;
}
} if (hBitmap!=NULL)
DeleteObject(hBitmap); hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NewNumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS); if (hPalette && hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
} hf=_lcreat(BmpFileName,0);
_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
_lclose(hf); /*::*/ReleaseDC(0/*m_hWnd*/,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}int main (int argc,char **argv)
{
//Usage: if (LoadBmpFile("f:\\Test.bmp"))
{
ColorToGray("f:\\Gray.bmp");
}
return 0;
}
=============================
真的啊,什么API啊,写出来吧