热门标签 | 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;


最终我用来显示的代码

推荐阅读
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
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社区 版权所有