用C语言编写程序处理图片bmp文件 1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直

用C语言编写程序处理图片bmp文件1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直分辨率2.显示bmp文件... 用C语言编写程序处理图片bmp文件
1.读取图片的宽度,高度,每个像素所需的位数,水平分辨率,垂直分辨率
2.显示bmp文件
展开
 我来答
478617
推荐于2017-09-30 · TA获得超过875个赞
知道小有建树答主
回答量:725
采纳率:100%
帮助的人:81.4万
展开全部
#include <windows.h>
//读bmp图片需要两个结构
#pragma pack(push, enter_defBM, 1) //指定内存对齐单位为1。
typedef struct tagBmpFileHeader
{
WORD  bfType;      // 文件类型  BM
DWORD bfSize;      // 文件大小
WORD  bfReserved1; // 保留字
WORD  bfReserved2; // 保留字
DWORD bfOffBits;   // 位图的数据信息离文件头的偏移量
} BFH;
typedef struct tagBmpImgHeader
{
DWORD biSize;          // 表示本结构的大小,0X28
LONG  biWidth;         // 位图的宽度
LONG  biHeight;        // 位图的高度
WORD  biPlanes;        // 位面数永远为1
WORD  biBitCount;      // 位图的位数
DWORD biCompression;   // 压缩类型
DWORD biSizeImage;     // 表示位图数据区域的大小
LONG  biXPelsPerMeter; // 表示显示设备的水平分辨率
LONG  biYPelsPerMeter; // 表示显示设备的垂直分辨率
DWORD biClrUsed;       // 实际使用的颜色数目
DWORD biClrImportant;  // 重要的颜色数量
} BIH;
#pragma pack(pop, enter_defBM) //恢复默认内存对齐单位。

#define HDIB HANDLE // 位图句柄


DWORD WINAPI DIBNumColors(BYTE * data)
{
WORD wBitCount;
DWORD dwClrUsed = ((BIH *)data)->biClrUsed;
if (dwClrUsed != 0) return (WORD)dwClrUsed;
wBitCount = ((BIH *)data)->biBitCount;
return 1 << wBitCount;
}


WORD WINAPI PaletteSize(BYTE * data)
{
return (WORD)(::DIBNumColors(data) * sizeof(RGBQUAD));

BYTE *  WINAPI FindDIBBits(BYTE * data)
{
return (data + *(DWORD *)data + ::PaletteSize(data));
}

// 获取Bmp的宽度
DWORD FAR DIBWidth(const BYTE * data)   
{   
BIH * pbmi;
pbmi = (BIH *)data; 
if(pbmi->biSize == sizeof(BIH)) return pbmi->biWidth;
else return -1;
}   
// 获取Bmp的高度
DWORD FAR DIBHeight(const BYTE * data)   
{   
BIH * pbmi;
pbmi = (BIH *)data; 
if(pbmi->biSize == sizeof(BIH)) return pbmi->biHeight;
else return -1;
}   
// 从文件读取Bmp图像数据
HDIB WINAPI ReadDIBFile(FILE * fp)
{
BFH    bmf;
HDIB   hDIB;
BYTE * pData;

rewind(fp);
if(fread(&bmf, sizeof(BFH), 1, fp) != 1) return NULL; // 文件读取错误
if(bmf.bfType != 19778) return NULL;                  // 文件类型错误
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, bmf.bfSize); // 为DIB分配内存
if (hDIB == 0) return NULL;                           // 内存分配失败。
pData = (BYTE *)::GlobalLock((HGLOBAL) hDIB);         // 锁定
if(fread(pData, 1, bmf.bfSize - sizeof(BFH), fp) != (bmf.bfSize - sizeof(BFH))) // 文件读取错误
{
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
::GlobalFree((HGLOBAL) hDIB);   // 释放内存
return NULL;
}
::GlobalUnlock((HGLOBAL) hDIB);     // 解除锁定
return hDIB;                        // 返回DIB句柄
}

BOOL WINAPI PaintDIB(HDC hDC, int posX, int posY, HDIB hDIB)
{
BYTE *   pDIBHd;             // BITMAPINFOHEADER指针
BYTE *   pDIBBits;           // DIB象素指针
BOOL     bSuccess = FALSE;   // 成功标志
HPALETTE hPal     = NULL;    // DIB调色板
//HPALETTE hOldPal  = NULL;    // 以前的调色板
if (hDIB == NULL) return FALSE;                    // 判断DIB对象是否为空
pDIBHd    = (BYTE *) ::GlobalLock((HGLOBAL) hDIB); // 锁定DIB
pDIBBits  = ::FindDIBBits(pDIBHd);                 // 找到DIB图像象素起始位置
::SetStretchBltMode(hDC, COLORONCOLOR);            // 设置显示模式
    // 调用SetDIBitsToDevice()来绘制DIB对象
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
           posX, posY, 
   ((BIH *)pDIBHd)->biWidth,    // nDestWidth
   ((BIH *)pDIBHd)->biHeight,   // nDestHeight
           0,                           // SrcX
           0,                           // SrcY
           0,                           // nStartScan
           (WORD)DIBHeight(pDIBHd),     // nNumScans
           pDIBBits,                    // lpBits
           (LPBITMAPINFO)pDIBHd,        // lpBitsInfo
           DIB_RGB_COLORS);             // wUsage
::GlobalUnlock((HGLOBAL) hDIB);     // 解除锁定
return bSuccess;
}
// 打印位图信息
VOID WINAPI PrintDIBInfo(HDIB hDIB)
{
BYTE *   pDIBHd = (BYTE *)::GlobalLock((HGLOBAL) hDIB);
BIH *    pbmi   = (BIH *)pDIBHd;
const char *lp[] = 
{
"位图信息长度: %d\n",
"位图图像大小: %dx%d\n",
"位面数:%d\n",
"位图颜色深度: %d\n",
"位图数据压缩类型: %d\n",
"位图数据区域大小: %d\n",
"位图分辨率: 水平 %d dpi, 垂直 %d dpi\n",
};
printf("Windows V3 cBitmapInfoHeader 信息\n\n");
printf(lp[0], pbmi->biSize);
printf(lp[1], pbmi->biWidth, pbmi->biHeight);
printf(lp[2], pbmi->biPlanes);
printf(lp[3], pbmi->biBitCount);
printf(lp[4], pbmi->biCompression);
printf(lp[5], pbmi->biSizeImage);
printf(lp[6], (LONG)(pbmi->biXPelsPerMeter * 0.0254f + 0.5f), (LONG)(pbmi->biYPelsPerMeter * 0.0254f + 0.5f));
::GlobalUnlock((HGLOBAL) hDIB);     // 解除锁定
}



int main(int argc, char* argv[])
{
HDIB x;
FILE * fp = fopen("1.bmp", "rb");
if(fp==NULL) return -1;
x = ReadDIBFile(fp);
printf("DIB handle %u", x);
PaintDIB(GetDC(NULL), 0, 0, x);
PrintDIBInfo(x);
return 0;
}
更多追问追答
追问
这个可以在vc6.0里边运行吧????
谢谢你啊!
刘会丽劳动节
2015-01-24
知道答主
回答量:3
采纳率:0%
帮助的人:3734
展开全部
树大分叉vgbhjbbjn
追问
说的是什么东东啊?????
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
才爱上AA
2015-01-24 · 超过72用户采纳过TA的回答
知道小有建树答主
回答量:296
采纳率:100%
帮助的人:119万
展开全部
这个以前老师讲过 我还留了一份 发邮箱我给你发一份
追问
谢谢你啊
在吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-01-24
展开全部
关注次问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式