BMP图像转化成为二维数组

LoFang 2008-03-30 10:06:35
请问哪位大哥有把BMP图像转化成为二维数组的C语言程序?小弟急求,谢谢了!
...全文
621 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯魔症 2008-03-30
  • 打赏
  • 举报
回复
有读取显示bmp文件的C程序,这几天一直在看的,
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <math.h>
#include <windows.h>
#include <commdlg.h>
#include "WinImageP.h"

void WindowInitial(HINSTANCE hInstance,HINSTANCE hPrevInstance,int nCmdShow);
// 窗口主函数初始化程序
long FAR PASCAL WndProc(HWND,WORD,WORD,LONG);

char szAppName [] = "W32Image";
char szName[256];

int wid,hei,bits;

HBITMAP hBitmap=NULL;
LPSTR lpBits;

int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,int nCmdShow)
{
MSG msg;

if (lpszCmdLine==0) return 0;
WindowInitial(hInstance,hPrevInstance,nCmdShow);
while(GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

void WindowInitial(HINSTANCE hInstance,
HINSTANCE hPrevInstance,int nCmdShow)
{
HWND hWnd;
WNDCLASS wndclass;

if (!hPrevInstance) {
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = (WNDPROC)WndProc;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = szAppName;
wndclass.lpszClassName = szAppName;

RegisterClass(&wndclass);
}

hWnd = CreateWindow(szAppName,
"最简单的BMP图像文件的读写与显示程序 (Win32)",
WS_OVERLAPPEDWINDOW | WS_MAXIMIZEBOX | WS_MAXIMIZE,
0,0,
1024,768,
NULL,NULL,hInstance,NULL);

ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
}

long FAR PASCAL WndProc(HWND hWnd,WORD message,
WORD wParam,LONG lParam)
{
PAINTSTRUCT ps;

switch(message) {
case WM_CREATE:
return 0L;

case WM_COMMAND:
strcpy(szName,"");
switch (wParam) {
case IDM_OPEN:
CMUFileName(hWnd,"OPENFILENAME","open");
if (strlen(szName))
LoadBMP(szName);
return 0;

case IDM_OPENA:
CMUFileName(hWnd,"打开图像文件(后读入调色板)","open");
if (strlen(szName))
LoadBMPA(szName);
return 0;

case IDM_SAVE: // 存储图象
if (hBitmap) {
CMUFileName(hWnd,"SAVEFILENAME","save");
if (strlen(szName))
SaveBMP(szName,wid,hei,bits);
}
return 0;

case IDM_EXIT: // 退出
SendMessage(hWnd,WM_CLOSE,0,0L);
return 0;

case IDM_ABOUT: // 版权信息
MessageBox(hWnd,"华东理工大学信息学院 陆宗骐 编制\n\n 2005年 10月","版权信息",MB_OK);
return 0;
}
break ;

case WM_PAINT:
BeginPaint(hWnd,&ps);
ClearWindow(hWnd);
if (hBitmap)
DisplayDIBSection(hWnd,hBitmap,wid,hei);
EndPaint(hWnd,&ps);
break;

case WM_DESTROY:
if (hBitmap)
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}

void LoadBMP(LPCSTR lpstrFileName)
{
BITMAPFILEHEADER Bfh;
LPBITMAPINFO lpBmi;
FILE *fp;
int BmiSize,PixSize;

fp=fopen(lpstrFileName,"rb");
fread(&Bfh,14,1,fp);

BmiSize=Bfh.bfOffBits-14;
lpBmi=(LPBITMAPINFO) malloc(BmiSize);
fread(lpBmi,BmiSize,1,fp);

hBitmap=CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,
(VOID**) &lpBits,NULL,0);

wid =lpBmi->bmiHeader.biWidth;
hei =lpBmi->bmiHeader.biHeight;
bits=lpBmi->bmiHeader.biBitCount;
PixSize=(wid*bits+31)/32*4*hei;
free(lpBmi);

fseek(fp,Bfh.bfOffBits,SEEK_SET);
fread(lpBits,PixSize,1,fp);
fclose(fp);
}

void DisplayDIBSection(HWND hWnd, HBITMAP hBitmap, int wid, int hei)
{
HDC hDC, hMemDC;

hMemDC =CreateCompatibleDC(NULL);
SelectObject(hMemDC,hBitmap);
hDC = GetDC(hWnd);
BitBlt(hDC,0,0,wid,hei,hMemDC,0,0,SRCCOPY);
DeleteObject(hMemDC);
DeleteDC(hMemDC);
ReleaseDC(hWnd,hDC);
}

void LoadBMPA(LPCSTR lpstrFileName)
{
BITMAPFILEHEADER Bfh;
LPBITMAPINFO lpBmi;
FILE *fp;
int BmiSize,PalSize,PixSize;
HDC hMemDC;

fp=fopen(lpstrFileName,"rb");

fread(&Bfh,14,1,fp);

BmiSize=Bfh.bfOffBits-14;
PalSize=BmiSize-40;
lpBmi=(LPBITMAPINFO) malloc(BmiSize);
fread(lpBmi,40,1,fp);

hBitmap=CreateDIBSection(NULL,lpBmi,DIB_RGB_COLORS,(VOID**) &lpBits,NULL,0);

if (PalSize>0) {
fread(lpBmi->bmiColors,PalSize,1,fp);
hMemDC =CreateCompatibleDC(NULL);
SelectObject(hMemDC,hBitmap);
SetDIBColorTable(hMemDC,0,PalSize/4,lpBmi->bmiColors);
DeleteObject(hMemDC);
DeleteDC(hMemDC);
}

wid =lpBmi->bmiHeader.biWidth;
hei =lpBmi->bmiHeader.biHeight;
bits=lpBmi->bmiHeader.biBitCount;
PixSize=(wid*bits+31)/32*4*hei;
free(lpBmi);

fseek(fp,Bfh.bfOffBits,SEEK_SET);
fread(lpBits,PixSize,1,fp);
fclose(fp);
}

void SaveBMP(LPCSTR lpstrFileName,int wid,int hei,int bits)
{
BITMAPFILEHEADER BFH={'MB',0,0,0,0};
BITMAPINFOHEADER BIH={40,1,1,1,8,0,0,0,0,0,0};
FILE *fp;
int colors;
int BmiSize,PixSize;
RGBQUAD ColorTab[256];
HDC hMemDC;

if (bits<=8) colors=1<<bits;
else colors=0;
BmiSize=40+4*colors;
PixSize=(wid*bits+31)/32*4*hei;

BFH.bfOffBits=14+BmiSize;
BFH.bfSize =BFH.bfOffBits+PixSize;

BIH.biWidth = wid;
BIH.biHeight = hei;
BIH.biBitCount= bits;

fp=fopen(lpstrFileName,"w+b");
if (fp==NULL)
return;

fwrite(&BFH,1,14,fp);
fwrite((BYTE*)&BIH,1,40,fp);
if (bits<=8) {
hMemDC =CreateCompatibleDC(NULL);
SelectObject(hMemDC,hBitmap);
GetDIBColorTable(hMemDC,0,colors,ColorTab);
DeleteObject(hMemDC);
DeleteDC(hMemDC);
fwrite(ColorTab,4,colors,fp);
}
fwrite(lpBits,1,PixSize,fp);
fclose(fp);
}

void ClearWindow(HWND hWnd)
{
HDC hDC;
HBRUSH hBrush;
HPEN hPen;

hPen =GetStockObject(WHITE_PEN);
hBrush=GetStockObject(WHITE_BRUSH);

hDC = GetDC(hWnd);
SelectObject(hDC,hPen);
SelectObject(hDC,hBrush);
Rectangle(hDC,0,0,1024,768);
ReleaseDC(hWnd,hDC);
}

void CMUFileName(HWND hWnd,char *str,char *str1)
{
OPENFILENAME ofnTemp;
DWORD Errval,error;
char buf[5];
char Errstr[50]="GetOpenFileName returned Error #";
char szTemp[] = "BMP Files (*.bmp)\0*.bmp\0";

ofnTemp.lStructSize = sizeof( OPENFILENAME );
ofnTemp.hwndOwner = hWnd;
ofnTemp.hInstance = 0;
ofnTemp.lpstrFilter = (LPSTR)szTemp;
ofnTemp.lpstrCustomFilter = NULL;
ofnTemp.nMaxCustFilter = 0;
ofnTemp.nFilterIndex = 1;
ofnTemp.lpstrFile = (LPSTR)szName;
ofnTemp.nMaxFile = sizeof( szName );
ofnTemp.lpstrFileTitle = NULL;
ofnTemp.nMaxFileTitle = 0;
ofnTemp.lpstrInitialDir = NULL;
ofnTemp.lpstrTitle=str;
ofnTemp.Flags = OFN_FILEMUSTEXIST |
OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
ofnTemp.nFileOffset = 0;
ofnTemp.nFileExtension = 0;
ofnTemp.lpstrDefExt = "*";
ofnTemp.lCustData = 0L;
ofnTemp.lpfnHook = NULL;
ofnTemp.lpTemplateName = NULL;

error=0;
if ((str1[0]=='O')||(str1[0]=='o')) {
if (GetOpenFileName( &ofnTemp ) != TRUE) error=1;
}
else {
if (GetSaveFileName( &ofnTemp ) != TRUE) error=1;
}

if (error==1) {
Errval=CommDlgExtendedError();
if (Errval!=0) {
sprintf(buf,"%ld",Errval);
strcat(Errstr,buf);
MessageBox(hWnd,Errstr,"WARNING",MB_OK|MB_ICONSTOP);
}
}
InvalidateRect( hWnd, NULL, TRUE );
}
疯魔症 2008-03-30
  • 打赏
  • 举报
回复
读取显示bmp文件的程序,在VC++下调试的,学习中
zhaofang100 2008-03-30
  • 打赏
  • 举报
回复
那要是处理一个(灰度)bmp图像,是不是要先把bmp图像的图像数据变成矩阵的形式,然后在进行相关的运算?
hastings 2008-03-30
  • 打赏
  • 举报
回复
bmp是设备无关的,有很多个数据段,弄成二维数组,也不知道各个位的数值含义.
因为各个位的数值一般是颜色表里的索引.
zhaofang100 2008-03-30
  • 打赏
  • 举报
回复
1楼:
你的是什么程序?
是在tc上运行的吗?

70,017

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧