16位数组如何转化成16位灰度图

diaoying2987 2017-08-27 04:14:15
有个16位的数组需要转化为16位灰度图,要保证数组中的数据不发生改变,保留原有特征。如果转为256的灰度图,数组中的特征就会丢失。实现语言任意。
...全文
410 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-08-29
  • 打赏
  • 举报
回复
// grey = (30 * red + 59 * green + 11 * blue) / 100
schlafenhamster 2017-08-29
  • 打赏
  • 举报
回复

// Compression = BI_RGB,555 format。
//               BI_BITFIELDS,RedMask、GreenMask、BlueMask 565 format
void CShow256BmpDlg::OnButton5() 
{
	// TODO: Add your control notification handler code here
	CWaitCursor wait;
	CFile file;
#if 0 // 555
	file.Open("16.bmp",CFile::modeRead);
#else // 565 
	file.Open("16bf.bmp",CFile::modeRead);
#endif
	int ImageSize=file.GetLength();// 436534;436480*2=872960
	BYTE heads[sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER)];
	int Herd=file.Read(heads,sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER));// 54
	BITMAPFILEHEADER *pBmpFileHead=(BITMAPFILEHEADER *)heads;
	BITMAPINFOHEADER *pBmpInfoHead=(BITMAPINFOHEADER *)(heads+sizeof (BITMAPFILEHEADER));
	ImageSize = pBmpInfoHead->biSizeImage;// 436480  biSizeImage	  872960 = 0xD5200
//	bfOffBits	66-54=12/4=3DWORD
	BOOL bl565=FALSE;
	WORD ColorMask[3]={0};
	if(pBmpInfoHead->biCompression == BI_BITFIELDS)
	{
		bl565=TRUE;
//
		DWORD mk;
		file.Read(&mk,sizeof(DWORD));
		ColorMask[0]=(WORD)mk;
		file.Read(&mk,sizeof(DWORD));
		ColorMask[1]=(WORD)mk;
		file.Read(&mk,sizeof(DWORD));
		ColorMask[2]=(WORD)mk;
	}
//
	BYTE *bufferIn=new BYTE[ImageSize];
	int len=file.Read(bufferIn,ImageSize);// len=436480
	file.Close();
//
	int height=pBmpInfoHead->biHeight;// 341
	BYTE *bufferOut=new BYTE[ImageSize*2];
	BYTE *pBufferIn=bufferIn;
	BYTE *pBufferOut=bufferOut;
//
	for (; height>0; height--)// 341
	{
		int width =pBmpInfoHead->biWidth;// 640
// vertical flip: pBufferOut=&bufferOut[(height-1)*width*4];
		for (; width>0; width--)
		{
			//char prompt[40];
			//sprintf(prompt,"0x%0X%0X", *(pBufferIn+1) ,*pBufferIn);
			//afxDump << prompt << "\n";// 0x7BDE ; 0111 10-11 110-1 1111
			BYTE red   = 0;//                         7  C
			BYTE green = 0;//                                3  E
			BYTE blue  = 0;//                                      1   F
			if(bl565)
			{// for 16bf.bmp ;3 masks are :7C00 , 03E0, 001F ; 
				red   =((*(WORD *)pBufferIn) & ColorMask[0]) >> 7;//=0x7C00; 5(1st bit unused)
				green =((*(WORD *)pBufferIn) & ColorMask[1]) >> 2;//=0x03E0; 5
				blue  =((*(WORD *)pBufferIn) & ColorMask[2]) << 3;//=0x001F; 5
// if(ColorMask[0]==0xF800
//	BYTE red   =((*(WORD *)pBuffer) & 0xF800) >> 8;// 5
//	BYTE green =((*(WORD *)pBuffer) & 0x07E0) >> 3;// 6
//	BYTE blue  =((*(WORD *)pBuffer) & 0x001F) << 3;// 5
			}
			else
			{
				red   =((*(WORD *)pBufferIn) & 0x7C00) >> 7;
				green =((*(WORD *)pBufferIn) & 0x03E0) >> 2;
				blue  =((*(WORD *)pBufferIn) & 0x001F) << 3;
			}
			*pBufferOut=blue|7;// +7 ?
			pBufferOut++;
			*pBufferOut=green|7;
			pBufferOut++;
			*pBufferOut=red|7;
			pBufferOut++;
			*pBufferOut=0;
			pBufferOut++;
			pBufferIn += 2;
		}
	}
#if 0
	CFile fileDat;
	fileDat.Open("16bf.dat",CFile::modeCreate | CFile::modeWrite);
	fileDat.Write(bufferOut,ImageSize*2);
	fileDat.Close();
#endif
//
	delete []bufferIn;
// draw 
	CClientDC dc(this); // device context for painting
	CDC memDC;
	memDC.CreateCompatibleDC(&dc);
// change bmp info
	pBmpInfoHead->biSizeImage=ImageSize*2;
	pBmpInfoHead->biBitCount=32;
	pBmpInfoHead->biCompression=BI_RGB;
//
	void* tempArray=NULL;
	HBITMAP hBitmap=::CreateDIBSection(dc.m_hDC, (BITMAPINFO*)pBmpInfoHead,DIB_RGB_COLORS,&tempArray,NULL,0);
	memcpy(tempArray,bufferOut,ImageSize*2);
	delete []bufferOut;
//
	memDC.SelectObject(hBitmap);
	dc.BitBlt(0,0,pBmpInfoHead->biWidth,pBmpInfoHead->biHeight,&memDC,0,0,SRCCOPY);
}
worldy 2017-08-29
  • 打赏
  • 举报
回复
引用 楼主 diaoying2987 的回复:
有个16位的数组需要转化为16位灰度图,要保证数组中的数据不发生改变,保留原有特征。如果转为256的灰度图,数组中的特征就会丢失。实现语言任意。
new一个新的数组,按照你的转换算法,保存到新的数组里,这样原始数据不就保留了?
schlafenhamster 2017-08-29
  • 打赏
  • 举报
回复
/* People who are new to BITMAPINFOHEADER often screw up in handling the 16-bit format, because they don't realize that it is actually 15 bits -- five bits of red/green/blue each, and one unused high bit. This is known as a 555 or 1555 encoding. Despite this format having only 15 significant bits, it still uses a bit depth value of 16, which is what confuses newbies. Windows does actually support a true 16-bit encoding, which consists of five bits of red and blue each and six bits of green, or a 565 encoding. You can't get to it via BI_RGB, however; you have to use the special BI_BITFIELDS compression value instead. This adds three bit masks after the biClrImportant field that specify the exact bit locations of the red, green, and blue fields. When these bit masks are 0000F800, 000007E0, and 0000001F, respectively, the bitmap uses a 565 16-bit encoding. Windows GDI supports this format because a lot of popular graphics hardware used to support only a particular 16-bit frame buffer format and 565 was one of the common ones. */
PixelDemon 2017-08-29
  • 打赏
  • 举报
回复
16位灰度图,PC上不支持直接显示。
zgl7903 2017-08-29
  • 打赏
  • 举报
回复
TIFF 好像支持16位灰度的, http://blog.sina.com.cn/s/blog_5f2c831b01015wp5.html
shiter 2017-08-28
  • 打赏
  • 举报
回复
16位?两个图层,转成两张?

19,468

社区成员

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

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