如何在MFC中加载真彩色的图像资源啊
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MFC中加载真彩色的图像资源啊相关的知识,希望对你有一定的参考价值。
在Bitmap中最大只能加载256色的图片,但我需要加载的真彩色图片转化成256色后,会严重失真。
哪位高手来指点一下阿,如果能够实现的话愿将自己的全部积分赠送
能说得详细些吗?我要把一个真彩色的图片放到一个图画框里作为背景色,然后再在上面做实时操作
怎么没人回答阿,再加50分
http://topic.csdn.net/t/20030506/16/1746457.html
最主要就是操作DIB ,简化RGB的值更接近256色!
void ChangeTo256(LPSTR pDIB)
// TODO: Add your control notification handler code here
if(pDIB==NULL)
MessageBox("error");
return;
BeginWaitCursor();
BYTE ired,igreen,iblue;
long p,q;
LPBITMAPINFOHEADER pnewbmpinfo;//新图像信息头
long lineGrayBytes=WIDTHBYTES(Width*8);//256色每行字节数
// long lineGrayBytes=(Width+3)&~3;//也可以
BYTE* lpdest;//新位图指针
lpdest=(BYTE*)::malloc(Height*lineGrayBytes);
memset(lpdest,0,lineGrayBytes*Height);//初始化为0
int n=0;
for(p=0;p<Height;p++)
for(q=0;q<Width;n++,q++)
ired=*(lpNewDIBBits+p*lineNewBytes+q*3+2);
igreen=*(lpNewDIBBits+p*lineNewBytes+q*3+1);
iblue=*(lpNewDIBBits+p*lineNewBytes+q*3);
lpdest[p*lineGrayBytes+q]=(BYTE)((float)(0.299*ired)+(float)(0.587*igreen)+(float)(0.114*iblue));
pnewbmpinfo->biBitCount=8;
//设置调色板
RGBQUAD* lpRGBquad;
lpRGBquad=(RGBQUAD*)&pDIB[sizeof(BITMAPINFOHEADER)];//在信息头后
for(p=0;p<=256;p++)
lpRGBquad[p].rgbRed=(unsigned char)p;
lpRGBquad[p].rgbGreen=(unsigned char)p;
lpRGBquad[p].rgbBlue=(unsigned char)p;
lpRGBquad[p].rgbReserved=0;
lpGrayDIBBits=::FindDIBBits(pDIB);
BYTE* lpSrc;//原图像
for(p=0;p<Height*lineGrayBytes;p++)
lpSrc=(BYTE*)lpGrayDIBBits+p;
*lpSrc=lpdest[p];
::free((void*)lpdest);
CClientDC dc(this);
CDC* pDC=(CDC*)(&dc);
::StretchDIBits(pDC->m_hDC,/*START_POINT_X*/0,/*START_POINT_Y*/0,Width,Height,0,0,Width,Height,lpGrayDIBBits,(LPBITMAPINFO)pDIB,DIB_RGB_COLORS,SRCCOPY);
EndWaitCursor();
参考资料:http://topic.csdn.net/t/20030506/16/1746457.html
参考技术B 方法:1。在画图里复制过来。方法 2。动态创建
在 MFC 中从二进制文件加载图像
【中文标题】在 MFC 中从二进制文件加载图像【英文标题】:Load image from binary in MFC 【发布时间】:2011-08-25 00:59:17 【问题描述】:通常我使用带有路径的LoadImage 或带有资源ID 的LoadBitmap 进行图像加载。但是现在目标图像资源存储在数据库(SQLite)中。那么如何直接使用(避免存储临时文件)从 MFC 中的 db 中检索到的二进制数据?
【问题讨论】:
查看this question的第一个答案 【参考方案1】:这是我找到的解决方案,它在我的项目中运行良好。
1.从sqlite数据库中检索二进制数据的函数。
int CSqlite::retrieveBinaryData(int id , byte *pdata)
ASSERT(pdata != NULL);
int rc,size;
sqlite3_stmt * stmt;
sqlite3_prepare(dbh,"select id,content,size from images where id = ?",-1,&stmt,0);
sqlite3_bind_int(stmt,1,id);
rc = sqlite3_step(stmt);
if(rc == SQLITE_ROW)
num = sqlite3_column_int(stmt,0);
size = sqlite3_column_int(stmt,2);
byte *tmpdata = (byte * )sqlite3_column_blob(stmt,1);
memcpy(pdata,tmpdata,size);
return size;
return 0;
2.从上面的函数接收数据并将其转换为CBitmap以便我们使用它。
byte *tdata = new BYTE[BMP_MAX_SIZE];
CSqlite *sq = new CSqlite("mysqlite.db");
int size = sq->retrieveBinaryDatas(myid,tdata);
/* using the resource mentioned by alfonso in the comment */
BITMAPFILEHEADER* bmfh;
bmfh = (BITMAPFILEHEADER*)tdata;
BITMAPINFOHEADER* bmih;
bmih = (BITMAPINFOHEADER*)(tdata + sizeof(BITMAPFILEHEADER));
BITMAPINFO* bmi;
bmi = (BITMAPINFO*)bmih;
void* bits;
bits = (void*)(tdata + bmfh->bfOffBits);
HDC hdc = ::GetDC(NULL);
HBITMAP hbmp = CreateDIBitmap(hdc, bmih, CBM_INIT, bits, bmi, DIB_RGB_COLORS) ;
::ReleaseDC(NULL, hdc);
delete tdata;
BITMAP bitmap;
CBitmap *bmpBackground = CBitmap::FromHandle(hbmp);
【讨论】:
以上是关于如何在MFC中加载真彩色的图像资源啊的主要内容,如果未能解决你的问题,请参考以下文章