3,设备无关位图显示

建立了一个类Dib

Dib.h
#pragma once
#include “afx.h”
class CDib :public CObject
{
public:
CDib();
~CDib();

char* GetFileName();
BOOL IsValid();
DWORD GetSize();
UINT GetWidth();
UINT GetHeight();
UINT GetNumberOfColors();
RGBQUAD* GetRGB();
BYTE* GetData();
BITMAPINFO* GetInfo();
WORD PaletteSize(LPBYTE lpDIB);
WORD DIBNumColors(LPBYTE lpDIB);
void SaveFile(const CString fileName);
void LoadFile(const char* dibFileName);

private:
RGBQUAD* m_pRGB;
BYTE* m_pData;
UINT m_numberOfColors;
BOOL m_valid;
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER* m_pBitmapInfoHeader;
BITMAPINFO* m_pBitmapInfo;
BYTE* pDib;
DWORD size;
char m_fileName[256];

};
Dib.cpp
#include “stdafx.h”
#include “Dib.h”
#include <windowsx.h>

CDib::CDib()
{
size = 0;
}

CDib::~CDib()
{
GlobalFreePtr(m_pBitmapInfo);
}

char * CDib::GetFileName()
{
return m_fileName;
}

BOOL CDib::IsValid()
{
return m_valid;
}

DWORD CDib::GetSize()
{
if (m_pBitmapInfoHeader->biSizeImage != 0)
{
return m_pBitmapInfoHeader->biSizeImage;
}
DWORD height = (DWORD)GetHeight();
DWORD width = (DWORD)GetWidth();
return height * width;
}

UINT CDib::GetWidth()
{
return (UINT) m_pBitmapInfoHeader->biWidth;
}

UINT CDib::GetHeight()
{
return (UINT) m_pBitmapInfoHeader->biHeight;
}

UINT CDib::GetNumberOfColors()
{
int numberOfColors;
if ((m_pBitmapInfoHeader->biClrUsed == 0 ) && (m_pBitmapInfoHeader->biBitCount < 9))
{
switch (m_pBitmapInfoHeader->biBitCount)
{
case 1:
numberOfColors = 2;
break;

	case 4:numberOfColors = 16;break;case 8:numberOfColors = 256;break;}
}
else
{numberOfColors = (int)m_pBitmapInfoHeader->biClrUsed;
}
return numberOfColors;

}

RGBQUAD * CDib::GetRGB()
{
return m_pRGB;
}

BYTE * CDib::GetData()
{
return m_pData;
}

BITMAPINFO * CDib::GetInfo()
{
return m_pBitmapInfo;
}

WORD CDib::PaletteSize(LPBYTE lpDIB)
{
return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE));
}

WORD CDib::DIBNumColors(LPBYTE lpDIB)
{
WORD wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
switch (wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}

void CDib::SaveFile(const CString fileName)
{
//此函数只能保存经处理后宽度高度均没有改变大小的图像
strcpy(m_fileName, fileName);
CFile dibFile(m_fileName, CFile::modeCreate | CFile::modeWrite);
dibFile.Write((void*)& bitmapFileHeader, sizeof(BITMAPFILEHEADER));
dibFile.Write((void*)pDib, size);
dibFile.Close();
}

void CDib::LoadFile(const char * dibFileName)
{
strcpy(m_fileName, dibFileName);
CFile dibFile(m_fileName, CFile::modeRead);
dibFile.Read((void*)& bitmapFileHeader, sizeof(BITMAPFILEHEADER));
if (bitmapFileHeader.bfType != 0x4d42)
{
m_valid = FALSE;
AfxMessageBox(“This isn’t a bitmap file!”);
return;
}
DWORD fileLength = dibFile.GetLength();
size = fileLength - sizeof(BITMAPFILEHEADER);
pDib = (BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);
dibFile.Read((void*)pDib, size);
dibFile.Close();
m_pBitmapInfo = (BITMAPINFO*)pDib;
m_pBitmapInfoHeader = (BITMAPINFOHEADER*)pDib;
m_pRGB = (RGBQUAD*)(pDib + m_pBitmapInfoHeader->biSize);
int m_numberOfColors = GetNumberOfColors();
if (m_pBitmapInfoHeader->biClrUsed == 0)
{
m_pBitmapInfoHeader->biClrUsed = m_numberOfColors;
}
DWORD colorTableSize = m_numberOfColors * sizeof(RGBQUAD);
m_pData = pDib + m_pBitmapInfoHeader->biSize + colorTableSize;
if (m_pRGB == (RGBQUAD*) m_pData)
{
m_pRGB = NULL;
}
m_pBitmapInfoHeader->biSizeImage = GetSize();
m_valid = TRUE;
}

调用

#include “Dib.h”

CPalette* _hPalette = NULL;
CDib _cdib;

//加载位图
CMy1_showbitmapView::CMy1_showbitmapView()
{
// TODO: add construction code here
_cdib.LoadFile (“D:/Test/DataProcess/result.bmp”);

}
//创建调色板

CPalette * CMy1_showbitmapView::CreateBitmapPalette(CDib * pBitMap)
{
struct
{
WORD version;
WORD numberOfEntries;
PALETTEENTRY aEntries[256];
}palette = { 0x300,256 };
LPRGBQUAD pRGBTable = pBitMap->GetRGB();
UINT numberOfColors = pBitMap->GetNumberOfColors();
for (size_t i = 0; i < numberOfColors; i++)
{
palette.aEntries[i].peRed = pRGBTable[i].rgbRed;
palette.aEntries[i].peGreen = pRGBTable[i].rgbGreen;
palette.aEntries[i].peBlue = pRGBTable[i].rgbBlue;
palette.aEntries[i].peFlags = 0;
}

CPalette * hPalette = new CPalette;hPalette->CreatePalette((LPLOGPALETTE)& palette);
return hPalette;

}

//显示位图

void CMy1_showbitmapView::OnDraw(CDC* pDC)
{
CMy1_showbitmapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: add draw code for native data here
//this->StretchBitMap(pDC);
//控制缩放比例
int m_scale = 1;
//CDib类指针对象
BYTE* pBitmapData = _cdib.GetData();
LPBITMAPINFO pBitmapInfo = _cdib.GetInfo();
int bitmapHeight = _cdib.GetHeight();
int bitmapWidth = _cdib.GetWidth();
int scaledWidth = (int)(bitmapWidth * m_scale);
int scaledHeight = (int)(bitmapHeight * m_scale);
bool bGetRGB = _cdib.GetRGB();
if (!bGetRGB)
{return;
}CPalette* hPalette = CreateBitmapPalette(&_cdib);
//将已创建的调色板调用到设备上下文中
CPalette* hOldPalette = pDC->SelectPalette(hPalette, true);
//实现调色板
pDC->RealizePalette();
::StretchDIBits(pDC->GetSafeHdc(), 0, 0, scaledWidth, scaledHeight,0, 0,bitmapWidth, bitmapHeight,pBitmapData, pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
pDC->SelectPalette(hOldPalette, true);
::DeleteObject(hPalette);

}

运行结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/502711.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探讨javascript的程序性能

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 Web WorkerWorker之间通讯Worker销毁 Web Worker 当我们需要处理一些比较耗时的任务时&#xff0c;我们…

【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug

目录 前言 行断点 条件断点 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时&#xff0c;如果能确定大致的代码段&#xff0c;就可以在相应的行上设置一个断点&#xff08;Breakpoint&#xff09;&…

java-ssm-jsp广播剧制作订阅系统

java-ssm-jsp广播剧制作订阅系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

Jmeter压力测试指标

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 RT(response time) 什么是RT? RT就是指系统在接收到请求和做出相应这段时间跨度 但是值得一提…

谈谈高并发系统的设计方法论

何为高并发系统&#xff1f; 在理解高并发系统之前&#xff0c;我们先来理解几个相关概念。 什么是并发&#xff08;Conurrent&#xff09;&#xff1f; 在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同…

记录SSM项目集成Spring Security 4.X版本 之 加密验证和记住我功能

目录 前言 一、用户登录密码加密认证 二、记住我功能 前言 本次笔记的记录是接SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后补…

滑动窗口刷题(四)困难

目录 串联所有单词的子串 1.题目解析 2.算法思路 3.代码编写 1.题目解析 例&#xff1a;如果 s "barfoothefoobarman" word ["foo","bar"] 那么就去s中寻找"foobar"或者"barfoo",返回找到字串的起始位置。 s "…

计算机二级MySQL-错题、知识点合集04

计算机二级MySQL 第四章 索引 主键约束&#xff0c;不允许为空也不允许重复。 NOT NULL非空约束属于自定义完整约束 PRIMARY KEY 属于实体完整性约束 FOREIGN KEY外键约束 外键与其引用的主键应分别属于不同的表&#xff0c;可以属于同一个关系&#xff1b;一个关系中可以定…

回溯例题(leetcode17/37)

文章目录 leetcode37leetcode17 回溯跟枚举差不多。要注意“回溯”&#xff0c;别忘记“回”之前把之前的改动都复原。 leetcode37 leetcode37是解数独问题。本题保证有且仅有唯一解。 思路&#xff1a;先把空格子的位置存下来&#xff0c;然后对每一个空位置挨个枚举1-9。枚…

spring boot 实现定时任务(Spring Task)

spring boot 实现定时任务&#xff08;Spring Task&#xff09; 一、Spring Task介绍 从Spring 3开始&#xff0c;Spring自带了一套定时任务工具Spring-Task&#xff0c;可以把它看成是一个轻量级的Quartz&#xff0c;使用起来十分简单&#xff0c;除Spring相关的包外不需要额…

强大而灵活的python装饰器

装饰器&#xff08;Decorators&#xff09; 一、概述 在Python中&#xff0c;装饰器是一种特殊类型的函数&#xff0c;它允许我们修改或增强其他函数的功能&#xff0c;而无需修改其源代码。装饰器在函数定义之后立即调用&#xff0c;并以函数对象作为参数。装饰器返回一个新…

电机应用-正点原子直流有刷电机例程笔记

目录 基础驱动实验&#xff1a;调速和换向 初始化工作 电机基础驱动API 电压、电流、温度检测实验 初始化工作 采集工作 编码器测速实验 编码器接口计数原理 初始化工作 编码器测速工作 速度环控制实现 PID相关函数 PID运算 电流环控制实现 PID相关函数 PID运算…