如何在MFC中加载真彩色的图像资源啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MFC中加载真彩色的图像资源啊相关的知识,希望对你有一定的参考价值。

在Bitmap中最大只能加载256色的图片,但我需要加载的真彩色图片转化成256色后,会严重失真。
哪位高手来指点一下阿,如果能够实现的话愿将自己的全部积分赠送
能说得详细些吗?我要把一个真彩色的图片放到一个图画框里作为背景色,然后再在上面做实时操作
怎么没人回答阿,再加50分

参考技术A 看一看这个不错的算法:
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中加载真彩色的图像资源啊的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MFC 从文件中加载图像

vs2008 mfc 如何在对话框中加入一个menu

如何从资源位图文件中加载图像数据以进行 directshow 过滤器?

MFC 无法在 dbcore.cpp 中加载错误字符串资源

在 MFC 中从二进制文件加载图像

如何在 FMX 组件中加载资源