📄 bmp.c
字号:
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
Blue=(unsigned char )(*lpPtr++);
Green=(unsigned char )(*lpPtr++);
Red=(unsigned char )(*lpPtr++);
*(lpTempPtr++)=(unsigned char)(255-Blue);
*(lpTempPtr++)=(unsigned char)(255-Green);
*(lpTempPtr++)=(unsigned char)(255-Red);
}
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
if(hPalette && hPrevPalette){
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
}
hf=_lcreat("c:\\invert.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL LimbPatternM3(HWND hWnd)
{
DWORD BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
unsigned char num;
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"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,BufSize);
for(y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
num=(unsigned char)*lpPtr++;
if ( (num>>2) > BayerPattern[y&7][x&7])
*(lpTempPtr++)=(unsigned char)255;
else *(lpTempPtr++)=(unsigned char)0;
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
hDc=GetDC(hWnd);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
hf=_lcreat("c:\\limbm3.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL LimbPatternM4(HWND hWnd)
{
DWORD BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
DWORD i,j;
unsigned char num;
BYTE M4Pattern[16][16];
for(i=0;i<8;i++)
for(j=0;j<8;j++)
M4Pattern[i][j]=4*BayerPattern[i][j];
for(i=8;i<16;i++)
for(j=0;j<8;j++)
M4Pattern[i][j]=4*BayerPattern[i-8][j]+2;
for(i=0;i<8;i++)
for(j=8;j<16;j++)
M4Pattern[i][j]=4*BayerPattern[i][j-8]+3;
for(i=8;i<16;i++)
for(j=8;j<16;j++)
M4Pattern[i][j]=4*BayerPattern[i-8][j-8]+1;
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"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,BufSize);
for(y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
num=(unsigned char)*lpPtr++;
if ( num > M4Pattern[y&15][x&15])
*(lpTempPtr++)=(unsigned char)255;
else *(lpTempPtr++)=(unsigned char)0;
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
hDc=GetDC(hWnd);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
hf=_lcreat("c:\\limbm4.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL Steinberg(HWND hWnd)
{
DWORD OffBits,BufSize,IntBufSize;
LPBITMAPINFOHEADER lpImgData;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpPtr;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
unsigned char num;
float e,f;
HLOCAL hIntBuf;
int *lpIntBuf,*lpIntPtr;
int tempnum;
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
IntBufSize=(DWORD)bi.biHeight*LineBytes*sizeof(int);
if((hIntBuf=LocalAlloc(LHND,IntBufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
LocalFree(hTempImgData);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
lpIntBuf=(int *)LocalLock(hIntBuf);
//copy header data
memcpy(lpTempImgData,lpImgData,OffBits);
//copy image data to int buffer
for(y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes;
for(x=0;x<bi.biWidth;x++)
*(lpIntPtr++)=(unsigned char)*(lpPtr++);
}
for(y=0;y<bi.biHeight;y++){
for(x=0;x<bi.biWidth;x++){
lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes+x;
num=(unsigned char)*lpIntPtr;
if ( num > 128 ){
*lpIntPtr=255;
e=(float)(num-255.0);
}
else{
*lpIntPtr=0;
e=(float)num;
}
if(x<bi.biWidth-1){
f=(float)*(lpIntPtr+1);
f+=(float)( (3.0/8.0) * e);
*(lpIntPtr+1)=(int)f;
}
if(y<bi.biHeight-1){
f=(float)*(lpIntPtr-LineBytes);
f+=(float)( (3.0/8.0) * e);
*(lpIntPtr-LineBytes)=(int)f;
f=(float)*(lpIntPtr-LineBytes+1);
f+=(float)( (1.0/4.0) * e);
*(lpIntPtr-LineBytes+1)=(int)f;
}
}
}
//copy new image data from int buffer
for(y=0;y<bi.biHeight;y++){
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes;
for(x=0;x<bi.biWidth;x++){
tempnum=*(lpIntPtr++);
if(tempnum>255) tempnum=255;
else if (tempnum<0) tempnum=0;
*(lpTempPtr++)=(unsigned char)tempnum;
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
hDc=GetDC(hWnd);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
hf=_lcreat("c:\\steinberg.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
ReleaseDC(hWnd,hDc);
GlobalUnlock(hImgData);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
LocalUnlock(hIntBuf);
LocalFree(hIntBuf);
return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL Bmp2Txt(HWND hWnd)
{
DWORD OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HFILE hf;
int i, j, k,h,tint,grayindex;
char tchar;
int TransHeight, TransWidth;
for(i=0;i<94;i++)
for(j=i+1;j<95;j++){
if(gr[i]>gr[j]){
tchar=ch[i],tint=gr[i];
ch[i]=ch[j],gr[i]=gr[j];
ch[j]=tchar,gr[j]=tint;
}
}
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
TransWidth = bi.biWidth/8;
TransHeight = bi.biHeight/16;
hf=_lcreat("c:\\bmp2txt.txt",0);
for(i=0;i<TransHeight;i++){
for(j=0;j<TransWidth;j++){
grayindex=0;
for(k=0;k<16;k++)
for(h=0;h<8;h++){
lpPtr=(char *)lpImgData+BufSize-LineBytes-(i*16+k)*LineBytes+j*8+h;
grayindex+=(unsigned char)*lpPtr;
}
grayindex/=16*8;
grayindex=gr[94]*grayindex/255;
k=0;
while(gr[k+1]<grayindex)
k++;
_lwrite(hf,(char *)&ch[k],sizeof(char));
}
tchar=(char)13;
_lwrite(hf,(char *)&tchar,sizeof(char));
tchar=(char)10;
_lwrite(hf,(char *)&tchar,sizeof(char));
}
_lclose(hf);
GlobalUnlock(hImgData);
return TRUE;
}
////////////////////////////////////////////////////////////////
BOOL Histogram(HWND hWnd)
{
DWORD OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
int x,y;
int grayindex;
HWND hPopupWnd;
int temp;
for(grayindex=0;grayindex<256;grayindex++)
GrayTable[grayindex]=0;
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
for(y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
grayindex=(unsigned char)*(lpPtr++);
GrayTable[grayindex]++;
}
}
MaxGrayNum=0;
MinGrayNum=65535;
for(grayindex=0;grayindex<256;grayindex++){
temp=GrayTable[grayindex];
if(temp>MaxGrayNum)
MaxGrayNum=temp;
if( (temp<MinGrayNum) && (temp>0) )
MinGrayNum=temp;
}
GlobalUnlock(hImgData);
hPopupWnd = CreateWindow (
"PopupWindowClass",
"Histogram Statistic Window",
WS_OVERLAPPEDWINDOW,
50,80,550,350,
hWnd,NULL,ghInst,NULL
);
if (hPopupWnd){
ShowWindow (hPopupWnd, SW_SHOW);
UpdateWindow (hPopupWnd);
}
return TRUE;
}
////////////////////////////////////////////////////////////////
long FAR PASCAL PopupWndProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
DWORD i;
int xstart;
static LOGPEN blp={PS_SOLID,1,1,RGB(0,0,255)};
HPEN bhp;
float a,b,temp;
char str[10];
a=(float)(265.0 /( MaxGrayNum - MinGrayNum) );
b=(float) (270.0-a* MaxGrayNum);
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
bhp = CreatePenIndirect(&blp);
SelectObject(hdc,bhp);
MoveToEx(hdc,2,270,NULL);
LineTo(hdc,518,270);
xstart=2;
for(i=0;i<256;i++){
MoveToEx(hdc,xstart,270,NULL);
if (GrayTable[i]!=0)
temp=(float)(a*GrayTable[i]+b);
else temp=0.0f;
LineTo(hdc,xstart,270-(int)temp);
if (i%16 ==0){
MoveToEx(hdc,xstart,270,NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -