热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MFC中如何将24位颜色数组显示出来?

有一个一维数组,数据是图像颜色信息,每三个字节代表一个像素的RGB值,知道图像大小,想用MFC简单的显示成图像。求大神指教,详细一点最好,在网上搜索到添加位图信息头的方法,可是我显示不出来。
有一个一维数组,数据是图像颜色信息,每三个字节代表一个像素的RGB值,知道图像大小,想用MFC简单的显示成图像。求大神指教,详细一点最好,在网上搜索到添加位图信息头的方法,可是我显示不出来。

10 个解决方案

#1


本帖最后由 VisualEleven 于 2016-07-04 17:11:11 编辑
在论坛上看到一个用三个数组分别存储RGB,用MFC显示的帖子,然后试了试里面的代码,也显示不出来,本人MFC小白,求指教!!!!!!        
        pDC = GetDC();
CDC memdc;
CBitmap bmp;
CRect rt;

memdc.CreateCompatibleDC(pDC);
bmp.CreateBitmap(winw, winh, 1, 24, &density_vec[0]);
CBitmap* pOldBitmap = memdc.SelectObject(&bmp);

pDC->BitBlt(0, 0, winw, winh, &memdc, 0, 0, SRCCOPY);

memdc.SelectObject(pOldBitmap);
memdc.DeleteDC();
ReleaseDC(pDC);

#2


SetDIBits StretchDIBits

#3


引用 2 楼 zgl7903 的回复:
SetDIBits StretchDIBits



用这个是要先设置位图信息头么?我也不是很懂位图的结构,之前也有试过按网上的方法先写信息头再进行显示也没有成功,可能是我设置参数有问题,网上方法的是灰度值数组,我的是24位RGB。不知道可不可以给个详细点的过程?

#4


参考

// make bitmap info
LPBITMAPINFO pBMPinfo;
pBMPinfo=(LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER)+16*sizeof(RGBQUAD)];
ZeroMemory(&pBMPinfo->bmiHeader,sizeof(BITMAPINFOHEADER));
pBMPinfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pBMPinfo->bmiHeader.biBitCount=4;
pBMPinfo->bmiHeader.biWidth=648;
pBMPinfo->bmiHeader.biHeight=508;
pBMPinfo->bmiHeader.biPlanes=1;
pBMPinfo->bmiHeader.biSizeImage=648*508/2;
// copy colors
for(int jj=0; jj<16; jj++)
{// reversed !
pBMPinfo->bmiColors[jj].rgbReserved=0;
pBMPinfo->bmiColors[jj].rgbRed=(BYTE)(color_table[jj]  & 0x0000FF);
pBMPinfo->bmiColors[jj].rgbGreen=(BYTE)((color_table[jj] & 0x00FF00) >> 8);
pBMPinfo->bmiColors[jj].rgbBlue=(BYTE)((color_table[jj]   & 0xFF0000) >> 16);
}
// draw bmp
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),0,0,wid,hei,0,0,wid,hei,
ScreenPtr1,// 数据
pBMPinfo,
DIB_RGB_COLORS,SRCCOPY);
// free
delete pBMPinfo;
delete [] ScreenPtr1;
return;

#5


void CXXXDlg::SaveBitmap(CONST BYTE* pImageBuffer, int nImageSize, int nImageWidth, int nImageHeight)
{
do
{
// Set Save Bitmap Path
TCHAR szPath[MAX_PATH] = {0};
GetModuleFileName(NULL, szPath, _countof(szPath));
_tcsrchr(szPath, _T('\\'))[1] = _T('\0');
_tcscat_s(szPath, _countof(szPath) - _tcslen(szPath), _T("Barcode.bmp"));

// Create File
HANDLE hFile = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
break;
}

#define DEFAULT_RGBQUAD_COUNT (256)
#define DEFAULT_BITCOUNT_BASE (8)

// Get Bitmap BitCount
int nBitCount = (nImageSize / (nImageWidth * nImageHeight)) * DEFAULT_BITCOUNT_BASE; // BitCount
// Get Bitmap Color
int nColors = 1 << nBitCount;

if(nColors > DEFAULT_RGBQUAD_COUNT) { nColors = 0; }

// Bitmap File Header
BITMAPFILEHEADER bfh = {0};
bfh.bfType = 0x4d42; // 'BM'
bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nColors * sizeof(RGBQUAD) + nImageSize;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nColors * sizeof(RGBQUAD);
WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), NULL, NULL); // Bitmap File Header

// Bitmap Info Header
BITMAPINFOHEADER bih = {0};
bih.biBitCount = (WORD)nBitCount;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = nImageWidth;
bih.biHeight = nImageHeight;
bih.biPlanes = 1;
bih.biCompression = BI_RGB;
bih.biSizeImage = (((bih.biWidth * bih.biBitCount + 31) & ~31) / DEFAULT_BITCOUNT_BASE) * bih.biHeight;

WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), NULL, NULL); // Bitmap Information Header

// RGBQUAD Data
RGBQUAD rgbQuad[DEFAULT_RGBQUAD_COUNT] = {0};
for(size_t i = 0; i != _countof(rgbQuad); ++i)
{
rgbQuad[i].rgbRed = rgbQuad[i].rgbGreen = rgbQuad[i].rgbBlue = (BYTE)i;
rgbQuad[i].rgbReserved = 0;
}
WriteFile(hFile, rgbQuad, nColors * sizeof(RGBQUAD), NULL, NULL); // RGBQUAD

// Bitmap Data
WriteFile(hFile, pImageBuffer, nImageSize, NULL, NULL); // Bitmap Data

// Close File Handle
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
} while (FALSE);
}

#6


引用 4 楼 schlafenhamster 的回复:
参考

// make bitmap info
LPBITMAPINFO pBMPinfo;
pBMPinfo=(LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER)+16*sizeof(RGBQUAD)];
ZeroMemory(&pBMPinfo->bmiHeader,sizeof(BITMAPINFOHEADER));
pBMPinfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pBMPinfo->bmiHeader.biBitCount=4;
pBMPinfo->bmiHeader.biWidth=648;
pBMPinfo->bmiHeader.biHeight=508;
pBMPinfo->bmiHeader.biPlanes=1;
pBMPinfo->bmiHeader.biSizeImage=648*508/2;
// copy colors
for(int jj=0; jj<16; jj++)
{// reversed !
pBMPinfo->bmiColors[jj].rgbReserved=0;
pBMPinfo->bmiColors[jj].rgbRed=(BYTE)(color_table[jj]  & 0x0000FF);
pBMPinfo->bmiColors[jj].rgbGreen=(BYTE)((color_table[jj] & 0x00FF00) >> 8);
pBMPinfo->bmiColors[jj].rgbBlue=(BYTE)((color_table[jj]   & 0xFF0000) >> 16);
}
// draw bmp
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),0,0,wid,hei,0,0,wid,hei,
ScreenPtr1,// 数据
pBMPinfo,
DIB_RGB_COLORS,SRCCOPY);
// free
delete pBMPinfo;
delete [] ScreenPtr1;
return;



我按照自己的参数改了一下,但是copy colors那部分我不太懂,所以不太会改,然后画出来是全黑的,没有图像,求教

#7


引用 5 楼 VisualEleven 的回复:
void CXXXDlg::SaveBitmap(CONST BYTE* pImageBuffer, int nImageSize, int nImageWidth, int nImageHeight)
{
do
{
// Set Save Bitmap Path
TCHAR szPath[MAX_PATH] = {0};
GetModuleFileName(NULL, szPath, _countof(szPath));
_tcsrchr(szPath, _T('\\'))[1] = _T('\0');
_tcscat_s(szPath, _countof(szPath) - _tcslen(szPath), _T("Barcode.bmp"));

// Create File
HANDLE hFile = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
break;
}

#define DEFAULT_RGBQUAD_COUNT (256)
#define DEFAULT_BITCOUNT_BASE (8)

// Get Bitmap BitCount
int nBitCount = (nImageSize / (nImageWidth * nImageHeight)) * DEFAULT_BITCOUNT_BASE; // BitCount
// Get Bitmap Color
int nColors = 1 << nBitCount;

if(nColors > DEFAULT_RGBQUAD_COUNT) { nColors = 0; }

// Bitmap File Header
BITMAPFILEHEADER bfh = {0};
bfh.bfType = 0x4d42; // 'BM'
bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nColors * sizeof(RGBQUAD) + nImageSize;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nColors * sizeof(RGBQUAD);
WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), NULL, NULL); // Bitmap File Header

// Bitmap Info Header
BITMAPINFOHEADER bih = {0};
bih.biBitCount = (WORD)nBitCount;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = nImageWidth;
bih.biHeight = nImageHeight;
bih.biPlanes = 1;
bih.biCompression = BI_RGB;
bih.biSizeImage = (((bih.biWidth * bih.biBitCount + 31) & ~31) / DEFAULT_BITCOUNT_BASE) * bih.biHeight;

WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), NULL, NULL); // Bitmap Information Header

// RGBQUAD Data
RGBQUAD rgbQuad[DEFAULT_RGBQUAD_COUNT] = {0};
for(size_t i = 0; i != _countof(rgbQuad); ++i)
{
rgbQuad[i].rgbRed = rgbQuad[i].rgbGreen = rgbQuad[i].rgbBlue = (BYTE)i;
rgbQuad[i].rgbReserved = 0;
}
WriteFile(hFile, rgbQuad, nColors * sizeof(RGBQUAD), NULL, NULL); // RGBQUAD

// Bitmap Data
WriteFile(hFile, pImageBuffer, nImageSize, NULL, NULL); // Bitmap Data

// Close File Handle
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
} while (FALSE);
}



这个我没有尝试,不过这样过程中不是写了一个位图文件?可不可以不写出来,因为没有需要,想要尽可能的简单一点,显示出啦就好了

#8


24位没有 // copy colors 
我给的 16色的 所以 for(int jj=0; jj<16; jj++)
你的     pBMPinfo->bmiHeader.biBitCount=24;

#9


引用 8 楼 schlafenhamster 的回复:
24位没有 // copy colors 
我给的 16色的 所以 for(int jj=0; jj<16; jj++)
你的     pBMPinfo->bmiHeader.biBitCount=24;


谢谢,刚刚已经显示出来了,但是想问问既然24位没有copy colors,那么一开始申请位图信息头的空间时
 pBMPinfo=(LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER)+16*sizeof(RGBQUAD)];
后面那部分16*sizeof(RGBQUAD)是不是也可以不要呀?

#10



        LPBITMAPINFO pBMPinfo;
pBMPinfo = (LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER)];
ZeroMemory(&pBMPinfo->bmiHeader, sizeof(BITMAPINFOHEADER));
pBMPinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBMPinfo->bmiHeader.biBitCount = 24;
pBMPinfo->bmiHeader.biWidth = winw;
pBMPinfo->bmiHeader.biHeight = winh;
pBMPinfo->bmiHeader.biPlanes = 1;
pBMPinfo->bmiHeader.biSizeImage = (winw*24 + 31) / 32 * 4 * winh;

// draw bmp
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(), 0, 0, winw, winh, 0, 0, winw, winh,
&density_vec[0],// 数据
pBMPinfo,
DIB_RGB_COLORS, SRCCOPY);
// free
delete pBMPinfo;
return;


最终我用来显示的代码

推荐阅读
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
author-avatar
henrysong
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有