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


最终我用来显示的代码

推荐阅读
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
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社区 版权所有