资源简介

演示了DIB文件的读入、保存和显示,剔除一些特殊情况的考虑,主要关注整个DIB的操作流程,对DIB操作入门和提高均有帮助。

资源截图

代码片段和文件信息

#include 
#include “DibOperate.h“

static OPENFILENAME ofn;

void DibFileDlgInit(HWND hwnd)
{
static TCHAR szFilter[] = TEXT(“Bitmap Files(*.BMP)\0*.bmp\0“)
TEXT(“All Files(*.*)\0*.*\0\0“);

ofn.lStructSize = sizeof(OPENFILENAME); //结构体大小
ofn.hwndOwner = hwnd; //父窗口句柄
ofn.hInstance = NULL;
ofn.lpstrFilter = szFilter; //文件后缀名过滤选项
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = NULL; //打开文件全路径保存位置
ofn.nMaxFile = MAX_PATH; //打开文件全路径长度
ofn.lpstrFiletitle = NULL; //打开文件名保存位置
ofn.nMaxFiletitle = MAX_PATH; //打开文件名长度
ofn.lpstrInitialDir = TEXT(“.\\“); //打开的初始文件夹
ofn.lpstrtitle = NULL; //打开的文件对话框标题
ofn.Flags = 0;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = TEXT(“bmp“); //默认的文件后缀
ofn.lCustData = 0;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
}

BOOL DibGetOpenFile(HWND hwnd PTSTR pstrFileName PTSTR pstrtitleName)
{
ofn.hwndOwner = hwnd;
ofn.lpstrFile = pstrFileName;
ofn.lpstrFiletitle = pstrtitleName;
ofn.Flags = 0;

return GetOpenFileName(&ofn);
}

BOOL DibGetSaveFile(HWND hwnd PTSTR pstrFileName PTSTR pstrtitleName)
{
ofn.hwndOwner = hwnd;
ofn.lpstrFile = pstrFileName;
ofn.lpstrFiletitle = pstrtitleName;
ofn.Flags = OFN_OVERWRITEPROMPT;

return GetSaveFileName(&ofn);
}

BOOL DibTotalLoad(PTSTR szBmpFile 
  PBITMAPFILEHEADER *ppbmfh
  PBITMAPINFO *ppbmi
  PBYTE *ppBits
  PLONG pBmpWidth
  PLONG pBmpHeight)
{
HANDLE hFile;
DWORD dwFileSize dwBytesRead;
BOOL bSuccess;

//打开文件
hFile = CreateFile( szBmpFile 
GENERIC_READ FILE_SHARE_READ NULL 
OPEN_EXISTING FILE_FLAG_SEQUENTIAL_SCAN NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return FALSE;
}

//判断BMP文件大小(所有部分)
dwFileSize = GetFileSize(hFile NULL);

//分配对应大小内存用于保存磁盘BMP文件内容
*ppbmfh = malloc(dwFileSize);
if (!(*ppbmfh))
{
CloseHandle(hFile);
return FALSE;
}

//读入文件内容
bSuccess = ReadFile(hFile *ppbmfh dwFileSize &dwBytesRead NULL);
CloseHandle(hFile);

//校验读入是否正确和文件是否为BMP文件
if (!bSuccess ||
(dwBytesRead != dwFileSize) ||
(*ppbmfh)->bfType != *(WORD *)“BM“)
{
free(*ppbmfh);
return FALSE;
}

//计算剩余的返回参数
*ppbmi = (PBITMAPINFO)(*ppbmfh+1);
*ppBits = (PBYTE)(*ppbmfh) + (*ppbmfh)->bfOffBits;
*pBmpWidth = (*ppbmi)->bmiHeader.biWidth;
*pBmpHeight = (*ppbmi)->bmiHeader.biHeight;

return TRUE;
}

BOOL DibTotalSave(PTSTR szBmpFile PBITMAPFILEHEADER pbmfh)
{
BOOL bSuccess;
DWORD dwBytesWrite;
HANDLE hFile;

//打开要写入的文件
hFile = CreateFile(szBmpFile
   GENERIC_WRITE 0 NULL
   CREATE_ALWAYS FILE_ATTRIBUTE_NORMAL NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return FALSE;
}

//写入文件
bSuccess = WriteFile(hFile pbmfh pbmfh->bfSize &dwBytesWrite NULL);
CloseHandle(hFile);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-05-19 16:53  DIB的读入、保存和显示\
     目录           0  2014-05-19 16:53  DIB的读入、保存和显示\DIB\
     文件      579534  2014-05-19 15:24  DIB的读入、保存和显示\DIB\1.bmp
     文件      415854  2014-05-19 15:25  DIB的读入、保存和显示\DIB\2.bmp
     文件        2080  2014-05-19 15:56  DIB的读入、保存和显示\DIB\DIB.rc
     文件        4154  2014-05-19 15:57  DIB的读入、保存和显示\DIB\DIB.vcproj
     文件        1417  2014-05-19 16:53  DIB的读入、保存和显示\DIB\DIB.vcproj.wenzhou-PC.wenzhou.user
     文件        7835  2014-05-19 16:52  DIB的读入、保存和显示\DIB\DibOperate.c
     文件         902  2014-05-19 16:06  DIB的读入、保存和显示\DIB\DibOperate.h
     文件        5885  2014-05-19 16:43  DIB的读入、保存和显示\DIB\Main.c
     文件        1010  2014-05-19 15:56  DIB的读入、保存和显示\DIB\resource.h
     文件         875  2014-05-19 13:33  DIB的读入、保存和显示\DIB的读入、保存和显示.sln

评论

共有 条评论