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


最终我用来显示的代码

推荐阅读
  • 本文探讨了在Qt框架下实现TCP多线程服务器端的方法,解决了一个常见的问题:服务器端仅能与最后一个连接的客户端通信。通过继承QThread类并利用socketDescriptor标识符,实现了多个客户端与服务器端的同时通信。 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • 本文探讨了Web API 2中特性的路由机制,特别是如何利用它来构建RESTful风格的URI。文章不仅介绍了基本的特性路由使用方法,还详细说明了如何通过特性路由进行API版本控制、HTTP方法的指定、路由前缀的应用以及路由约束的设置。 ... [详细]
  • 本文主要解决了在编译CM10.2时出现的关于Samsung Exynos 4 HDMI HAL库中SecHdmiV4L2Utils.cpp文件的编译错误。 ... [详细]
  • 深入理解Java反射机制
    本文将详细介绍Java反射的基础知识,包括如何获取Class对象、反射的基本过程、构造器、字段和方法的反射操作,以及内省机制的应用。同时,通过实例代码加深对反射的理解,并探讨其在实际开发中的应用。 ... [详细]
  • 本文详细介绍了Spring AOP注解的基本概念及其实现方式,并通过实例演示了如何在项目中使用这些注解进行面向切面的编程。旨在帮助开发者更好地理解和运用Spring AOP功能。 ... [详细]
  • 本文介绍了如何使用C# Winform开发局域网内的文件传输功能,详细描述了从用户界面到后端网络通信的具体实现。 ... [详细]
  • 使用Objective-C实现苹果官方NSLayoutConstraint页面布局
    本文详细介绍了如何在iOS开发中使用Objective-C语言通过NSLayoutConstraint来实现页面布局。示例代码展示了如何创建和应用约束,以确保界面元素能够正确地响应不同屏幕尺寸的变化。 ... [详细]
  • 本文提供了解决在尝试重置MySQL root用户密码时遇到连接失败问题的方法,包括停止MySQL服务、以安全模式启动MySQL、手动更新用户表中的密码等步骤。 ... [详细]
  • Activity跳转动画 无缝衔接
    Activity跳转动画 无缝衔接 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • 本文详细介绍了如何处理Oracle数据库中的ORA-00227错误,即控制文件中检测到损坏块的问题,并提供了具体的解决方案。 ... [详细]
  • 本文介绍如何通过创建数据库触发器来限制Oracle数据库中特定用户的登录IP地址,以增强系统的安全性。示例代码展示了如何阻止非授权IP地址的登录尝试。 ... [详细]
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社区 版权所有