24转16位 32位转16位 位图 c语言函数,请问不确定格式的位图转换为24位位图如何弄?(看不懂的清点进来)...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

bmp是从jpg转来的,已经获取句柄为hBmp,但是它转换来的总是和屏幕的颜色尾数相同(比如我屏幕是16位增强色他也是16位的,我屏幕是真彩色他就成了32位的)。

这个函数返回一个void*,指向的是所有像素的RGB值线性排列。那么就必须先转成24位RGB才行。问题是这个转换有问题:

// hBmp: bmp句柄// ret: 返回值对象,其中数据位于ret->data

void* buffer = new unsigned char[bmpsize*3];

if(!buffer){

DeleteObject(hBmp);

delete ret;

return NULL;

}

// 向buffer中保存bmp的像素信息。

if(bm.bmBitsPixel != 24){

// 如果不是24位RGB需要先转换成24位RGB。

BITMAPINFO bi;

bi.bmiHeader.biBitCount = 24;

bi.bmiHeader.biClrImportant = 0;

bi.bmiHeader.biClrUsed = 0;

bi.bmiHeader.biCompression = BI_RGB;

bi.bmiHeader.biHeight = bm.bmHeight;

bi.bmiHeader.biPlanes = 1;

bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bi.bmiHeader.biSizeImage = 0;

bi.bmiHeader.biWidth = bm.bmWidth;

bi.bmiHeader.biXPelsPerMeter = 0;

bi.bmiHeader.biYPelsPerMeter = 0;

HDC hScrDC = GetDC(NULL);

HDC hMemDC = CreateCompatibleDC(hScrDC);

void* newbuffer;

HBITMAP hBmpTemp = CreateDIBSection(hScrDC, &bi, DIB_RGB_COLORS, &newbuffer, NULL, 0);

//HBITMAP hBmpTemp = CreateCompatibleBitmap(hMemDC, bm.bmHeight, bm.bmWidth);

if(!hBmpTemp){

DeleteObject(hBmp);

delete ret;

return NULL;

}

SelectObject(hScrDC, hBmp);

SelectObject(hMemDC, hBmpTemp);

BitBlt(hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hScrDC, 0, 0, SRCCOPY);

GetBitmapBits(hBmpTemp, bmpsize*3, buffer);

DeleteObject(hBmpTemp);

DeleteObject(hBmp);

} else {

// 如果是24位RGB可以直接保存。

GetBitmapBits(hBmp, bmpsize*3, buffer);

DeleteObject(hBmp);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void CExample10View::OnSave555BiBitfields() { // TODO: Add your command handler code here if(lpBmpDataBuf==NULL) { MessageBox("当前没有打开的位"); return; } BYTE r,g,b; LPBYTE lpDest,lpSrc; int i,j; int nheapSize; CFileDialog filesavebox(FALSE,"bmp","BI_BITFIELDS.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"files(*.bmp)|*.bmp|",NULL); CFile file; CString strPathname; if(m_bmi.biBitCount!=24) { MessageBox("当前打开的位不是24位位"); return; } memcpy(&m_newbmf,&m_bmf,sizeof(BITMAPFILEHEADER)); memcpy(&m_newbmi,&m_bmi,sizeof(BITMAPINFOHEADER)); m_newbmi.biBitCount=16; m_newbmi.biCompression=BI_BITFIELDS;//即3 m_newbmi.biSizeImage=WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3; nheapSize=sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; if(lpnewBmpDataBuf!=NULL) { delete []lpnewBmpDataBuf; lpnewBmpDataBuf=NULL; } lpnewBmpDataBuf=new BYTE[nheapSize]; memcpy(lpnewBmpDataBuf,&m_newbmi,sizeof(BITMAPINFOHEADER)); DWORD* lp=(DWORD*)(lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)); *lp++=0x00007c00; *lp++=0x000003e0; *lp =0x0000001f; for(i=0;i<m_newbmi.biHeight;i++) { for(j=0;j<m_newbmi.biWidth;j++) { lpSrc=lpBmpDataBuf+sizeof(BITMAPINFOHEADER) +WIDTHBYTES(m_bmi.biWidth,m_bmi.biBitCount)*(m_bmi.biHeight-1-i) +j*3; lpDest=lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*(m_newbmi.biHeight-1-i) +j*2; b=*lpSrc++; b&=0xf8; g=*lpSrc++; g&=0xf8; r=*lpSrc++; r&=0xf8; WORD* lp=(WORD*)lpDest; *lp=0; *lp=r<<7; *lp+=(g<>3); } } if(filesavebox.DoModal()!=IDOK) return; strPath

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值