如何对图像的色彩数进行转换

mycrazycracy 2009-07-23 12:52:18
讲24位转成256色,有相对简单的方法吗?

讲下原理就行了。以后还要把24位转成32位。

另外怎么看一幅图的是真彩还是伪色彩?通过什么方法查看?

...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycrazycracy 2009-07-30
  • 打赏
  • 举报
回复
恩,5楼真棒!, opencv学习中。。。谢各位
daxuewuli417 2009-07-29
  • 打赏
  • 举报
回复
用opencv吧。。。方便好用
FlySkyFree 2009-07-29
  • 打赏
  • 举报
回复
学习了
副组长 2009-07-28
  • 打赏
  • 举报
回复
24位转成256色是一个比较复杂的问题,大概思路是将24位真彩色图像统计其累积概率,找出前256种重要颜色,然后将其它256*256*256-256种样色就近归类到重要颜色里面,用这些重要颜色建立一个LUT(Look Up Table)根据它建立自己的调色板。

真彩还是伪色彩可以打开文件看文件头,BMP文件有详细的信息头BITMAPINFOHEADER。

gxsxq 2009-07-28
  • 打赏
  • 举报
回复
数字图像处理 这书上讲有彩色图像处理的,楼主可以自己借来看看
laviewpbt 2009-07-28
  • 打赏
  • 举报
回复
http://www.cnblogs.com/laviewpbt/archive/2009/07/20/1526954.html

真彩色图像转换为16位(高彩色)图像的实现及需要注意的事项。
diannaomingong 2009-07-28
  • 打赏
  • 举报
回复
对每个点SetRGB(x,y,(r/32)*32,(g/32)*32,(b/32)*32);

这样就是512色

aigood 2009-07-28
  • 打赏
  • 举报
回复
直接上代码

void CDdb::SaveAs256(const char *pszDibFileName, int x, int y, int nWidth, int nHeight)
{
ASSERT(pszDibFileName);
if(m_nBitCount <= 8)
{
Save(pszDibFileName, x, y, nWidth, nHeight);
return;
}

//首先进行参数合法性检测
if((x > m_nWidth - 1) || (y > nHeight - 1))
{
AfxMessageBox("Cross the border!");
return;
}
AfxGetApp()->BeginWaitCursor();

//被保存的最后有效宽度和高度:w , h.
LONG w = (LONG)min(nWidth, m_nWidth - x);
LONG h = (LONG)min(nHeight, m_nHeight - y);


//////////////////////////////////////////////////////
//第一步:将数据转化为24位DDB数据
//原DDB数据转换成24位后, 每行的大小和总的数据量
DWORD dwWidthBytes24 = ((w * 24 + 15) / 16) * 2;
DWORD dwBitsSize24 = dwWidthBytes24 * h;

//分配全局内存, 以存放经格式转换后的像素数据

//指向24位数据的指针
BYTE* pbyDdbBits24 = new BYTE[dwBitsSize24];
if(pbyDdbBits24 == NULL) return;
memset(pbyDdbBits24, 0, dwBitsSize24);

//指向24位像素数据的指针, 这些数据是由16, 24, 32位模式转化而来的.
GetDdbDataTo24(x, y, w, h, pbyDdbBits24);


//////////////////////////////////////////////////////
//第二步, 获取量化后的数据
//分配存储8位数据的内存
DWORD dwWidthBytes8 = ((w * 8 + 15) / 16) * 2;
DWORD dwBitsSize8 = dwWidthBytes8 * h;

//指向8位数据的指针
BYTE* pbyDdbBits8 = new BYTE[dwBitsSize8];
if (pbyDdbBits8 == NULL)return ;
memset(pbyDdbBits8, 0 , dwBitsSize8);

//////////////////////////////////////////////////////
//获取量化数据
CPalette* pPalette = new CPalette();
QuantizeColor(pbyDdbBits24, w, h, pbyDdbBits8, pPalette);


//////////////////////////////////////////////////////
//获取调色数据
RGBQUAD* pRGBQuad = new RGBQUAD[256];
if(pRGBQuad == NULL)return;
//初始化为0
memset(pRGBQuad, 0, 256 * sizeof(RGBQUAD));

PALETTEENTRY* pPE = new PALETTEENTRY[256];
if(pPE == NULL)return;
pPalette->GetPaletteEntries(0, 256, pPE);

for(int j = 0; j < 256; j++)
{
pRGBQuad[j].rgbRed = pPE[j].peRed;
pRGBQuad[j].rgbGreen = pPE[j].peGreen;
pRGBQuad[j].rgbBlue = pPE[j].peBlue;
}

delete[] pPE;
delete pPalette;

//////////////////////////////////////////////////////
//第三步, 填充与位图相关的结构

//宽度字节数
DWORD dwDibWidthBytes = ((w * 8 + 31) / 32) * 4;
//位图数据大小
DWORD dwDibBitsSize = dwDibWidthBytes * h;

//计算整个Dib文件的大小dwFileSize
DWORD dwFileSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ 256 * sizeof(RGBQUAD)
+ dwDibBitsSize;

//计算位图信息到位图数据间的偏移量(字节)
DWORD dwOffBits = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ 256 * sizeof(RGBQUAD);

//位图文件头结构和位图信息结构
BITMAPFILEHEADER bmFileHeader;
BITMAPINFOHEADER bmInfo;

//填充BITMAPFILEHEADER结构
bmFileHeader.bfType=0x4d42;
bmFileHeader.bfSize = dwFileSize;
bmFileHeader.bfReserved1 = 0;
bmFileHeader.bfReserved2 = 0;
bmFileHeader.bfOffBits = dwOffBits;

//填充BITMAPINFOHEADER结构

bmInfo.biSize = sizeof(BITMAPINFOHEADER);
bmInfo.biWidth = w;
bmInfo.biHeight = h;
bmInfo.biPlanes = 1;
bmInfo.biBitCount = 8;
bmInfo.biCompression = 0;
bmInfo.biSizeImage = 0;
bmInfo.biXPelsPerMeter = 0;
bmInfo.biYPelsPerMeter = 0;
bmInfo.biClrUsed = 0;
bmInfo.biClrImportant = 0;

//第四步, 写数据
//////////////////////////////////////////////////////
try
{
// 请创建自己的目录或获取当前目录:
CFile file((LPCTSTR )pszDibFileName, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive);

//写入文件头和位图信息
file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER));
file.Write((LPSTR)&bmInfo, sizeof(BITMAPINFOHEADER));

//写入数据
file.Write((LPSTR)pRGBQuad, 256 * sizeof(RGBQUAD));

delete[] pRGBQuad;
pRGBQuad = NULL;

//数据索引(行头)
DWORD dwBaseIndex = (DWORD)(h - 1) * dwWidthBytes8;

UINT nZero = dwDibWidthBytes - dwWidthBytes8;
BYTE abyZero[] = {0, 0};

for(int i = 0; i < h ; i++)
{
BYTE* pDibBits8 = pbyDdbBits8 + dwBaseIndex;
file.Write((LPSTR)pDibBits8, dwWidthBytes8);
if(nZero > 0)file.Write((LPSTR)abyZero, 2);
dwBaseIndex -= dwWidthBytes8;
}//end i

file.Close();
}//end try
catch(CFileException* e)
{
e->Delete();
}

if(pRGBQuad)delete[] pRGBQuad;

delete[] pbyDdbBits24;
delete[] pbyDdbBits8;

AfxGetApp()->EndWaitCursor();
}

19,468

社区成员

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

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