16 位灰度的IplImage 转为 Bitmap

mceet 2017-04-12 10:12:57
如题,如何实现。
目前8,24 位图都可以转:代码如下:

HDC hDC = CreateCompatibleDC(0);
if(pImg==NULL)LogMessage("have no image\r\n");
LogMessage("after createCompatibleDC()\r\n");
BYTE tmp[sizeof(BITMAPINFO)+255*4];

BITMAPINFO *bmi = (BITMAPINFO*)tmp;

HBITMAP hBmp;

int i;

memset(bmi,0,sizeof(BITMAPINFO));

bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bmi->bmiHeader.biWidth = pImg->width;

bmi->bmiHeader.biHeight = pImg->height;

bmi->bmiHeader.biPlanes = 1;

bmi->bmiHeader.biBitCount = pImg->nChannels * pImg->depth;

bmi->bmiHeader.biCompression = BI_RGB;
bmi->bmiHeader.biSizeImage=0;
//bmi->bmiHeader.biSizeImage = pImg->width*pImg->height*pImg->depth*pImg->nChannels/8;
//bmi->bmiHeader.biSizeImage=pImg->widthStep*pImg->height*1;
bmi->bmiHeader.biClrImportant =0 ;
LogMessage("before switch\r\n");

switch(pImg->nChannels * pImg->depth)

{

case 8 :

for(i=0 ; i < 256 ; i++)

{

bmi->bmiColors[i].rgbBlue = i;

bmi->bmiColors[i].rgbGreen= i;

bmi->bmiColors[i].rgbRed= i;

}

break;
case 16:
//bmi->bmiColors[0].

break;

case 32:

case 24:

((DWORD*) bmi->bmiColors)[0] = 0x00FF0000; /* red mask */

((DWORD*) bmi->bmiColors)[1] = 0x0000FF00; /* green mask */

((DWORD*) bmi->bmiColors)[2] = 0x000000FF; /* blue mask */

break;
default:
break;

}
LogMessage("before createCompatibleDC()\r\n");
hBmp = CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,NULL,0,0);
LogMessage("createCompatibleDC()\r\n");
SetDIBits(hDC,hBmp,0,pImg->height,pImg->imageData,bmi,DIB_RGB_COLORS);

// ::DeleteDC(hDC);
DeleteDC(hDC);
LogMessage("HBitmap\r\n");
MySaveBmpTofile(hBmp,"D:\\image2.bmp");
CBitmap *pBitmap=new CBitmap;

pBitmap->Attach(hBmp);


return pBitmap;
...全文
234 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mceet 2017-04-18
  • 打赏
  • 举报
回复
没人会算了,我用memory buffer mode 避开这个问题。
mceet 2017-04-12
  • 打赏
  • 举报
回复
我图片是16位灰度图,不是RGB555,也不是RGB565,。
schlafenhamster 2017-04-12
  • 打赏
  • 举报
回复
参考 void Map555(BYTE * pBuffer, int width) { for (; width>0; width--) { BYTE red = ( (* (WORD *) pBuffer) & 0x7C00 ) >> 7; BYTE green = ( (* (WORD *) pBuffer) & 0x03E0 ) >> 2; BYTE blue = ( (* (WORD *) pBuffer) & 0x001F ) << 3; // if ( MapRGB( red, green, blue ) ) // * ( WORD *) pBuffer = ( ( red >> 3 ) << 10 ) | ( ( green >> 3 ) << 5 ) | ( blue >> 3 ); pBuffer += 2; } } // void Map565(BYTE * pBuffer, int width) { for (; width>0; width--) { BYTE red = ( (* (WORD *) pBuffer) & 0xF800 ) >> 8; BYTE green = ( (* (WORD *) pBuffer) & 0x07E0 ) >> 3; BYTE blue = ( (* (WORD *) pBuffer) & 0x001F ) << 3; // if ( MapRGB( red, green, blue ) ) // * ( WORD *) pBuffer = ( ( red >> 3 ) << 11 ) | ( ( green >> 2 ) << 5 ) | ( blue >> 3 ); pBuffer += 2; } }
schlafenhamster 2017-04-12
  • 打赏
  • 举报
回复
bitmap 的 灰度 只有 256 级, 不可能 65536 级, 只能 区 高位 。 没听说过 “16位的显示器“
mceet 2017-04-12
  • 打赏
  • 举报
回复
不行,取高位的话,和8位灰度一样了,而8位灰度我都实现了
mceet 2017-04-12
  • 打赏
  • 举报
回复
用16位的显示器,可以看出来区别的
schlafenhamster 2017-04-12
  • 打赏
  • 举报
回复
能不能 截取 高位 ?
mceet 2017-04-12
  • 打赏
  • 举报
回复
这是扫描仪扫出来的文件,文件都生成了,PS下也可以打开,现在想把图片通过Twain接口直接传到PS里边去。所以要转为DIB.
schlafenhamster 2017-04-12
  • 打赏
  • 举报
回复
灰度 等级 在0-65535 之间, 人眼可区分 ?
mceet 2017-04-12
  • 打赏
  • 举报
回复
16灰度是每像素16位数据来表示一个灰度值,大小在0-65535 之间。是RGB数据的1/3大小,不是RGB相等的图。
schlafenhamster 2017-04-12
  • 打赏
  • 举报
回复
16 位 就是 RGB565 (5+6+5) RGB555,是15位 1位 没用。 灰度 就是 R=G=B

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧