社区
图形处理/算法
帖子详情
位图的颜色转换
yflc
2002-10-21 05:33:09
24位转成256色和16色,怎么转?
...全文
179
8
打赏
收藏
位图的颜色转换
24位转成256色和16色,怎么转?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wrcluomo
2002-11-04
打赏
举报
回复
CCh1_1Doc* pDoc = GetDocument();// 获取文档
HDIB hDIB=pDoc->GetHDIB();
m_UnDo=CopyHandle(hDIB);
LPSTR lpDIB; // 指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());// 锁定DIB
if (lpDIB==NULL)return;
int NumColors;
NumColors=((LPBITMAPINFOHEADER)lpDIB)->biBitCount;
if(NumColors!=24)
{
MessageBox("不是24位真彩位图,不能操作。");
return;
}
BeginWaitCursor(); // 更改光标形状
LPSTR lpDIBBits;// 指向DIB图像开始处象素指针
LPSTR lpNewDIBBits;// 指向DIB灰度图图像开始处象素的指针
unsigned char * ired;
unsigned char * igreen;
unsigned char * iblack;
long i,j;// 循环变量
long lWidth,lHeight;// 图像宽度,图像高度
lWidth = ::DIBWidth(lpDIB); // 获取图像宽度
lHeight = ::DIBHeight(lpDIB);// 获取图像高度
lWidth =WIDTHBYTES(lWidth * 8);
lpDIBBits=::FindDIBBits(lpDIB);// 找到DIB图像象素起始位置&lpDIB[sizeof(BITMAPINFOHEADER)];
unsigned char * lpdest;
lpdest=(unsigned char *)::malloc(lHeight*lWidth);
int n=0;
for(j = 0; j <3*lWidth*lHeight; n++,j=j+3)//读取图像数据并转化成灰度
{
ired= (unsigned char*)lpDIBBits + j+2;
igreen = (unsigned char*)lpDIBBits+j+1;
iblack = (unsigned char*)lpDIBBits +j;
lpdest[n] =(unsigned char)(0.299*(*ired)+0.587*(*igreen)+0.114*(*iblack));
}
LPBITMAPINFOHEADER lpBI;//位图信息头
// 读取BITMAPINFO结构,初始化指针
lpBI = (LPBITMAPINFOHEADER)lpDIB;//[sizeof(BITMAPFILEHEADER)];
lpBI->biBitCount=8;
//设置256色灰度调色板
RGBQUAD *lpRGBquad;
lpRGBquad=(RGBQUAD *)&lpDIB[sizeof(BITMAPINFOHEADER)];//位图信息头后面为调色板
for (i = 0; i < 256; i++)
{
lpRGBquad[i].rgbRed =(unsigned char)i;// 读取红色分量
lpRGBquad[i].rgbGreen =(unsigned char)i;// 读取绿色分量
lpRGBquad[i].rgbBlue = (unsigned char)i;// 读取红色分量
lpRGBquad[i].rgbReserved = 0;// 保留位
}
lpNewDIBBits= ::FindDIBBits(lpDIB);// 找到DIB图像象素起始位置
unsigned char * lpSrc;
for (i=0;i<lHeight*lWidth;i++)//写灰度图像数据
{
lpSrc=(unsigned char*)lpNewDIBBits+i;
*lpSrc=lpdest[i];
}
::free((void *)lpdest);
pDoc->UpdateAllViews(NULL);//更新视图
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());// 解除锁定
EndWaitCursor();// 恢复光标
akiy
2002-11-04
打赏
举报
回复
如果用了gammergr的方法觉得效果不好
请联系我,不过是付费的!
zyl910
2002-11-04
打赏
举报
回复
有没有直接对象素的RGB进行转换的算法?
-------------------------------------------------
肯定没有
16色、256色都是调色版格式
必须考虑色彩量化处理
我以前用VB写的通过有序抖动保存各种格式的BMP(先进行相应抖动运算,再保存)的程序:
http://zyl910vb.51.net/vb/map/ddsfDIB.htm
右击连接,目标另存为
注意把下载后的*.zip.jpg改名成*.zip
这个程序是以前写的
刚学计算机图形学
不太懂
效率较低
gammergr
2002-11-03
打赏
举报
回复
hehe ,我做过这样的东东,256色的8个bit 中(RGB332),
一个语句就搞定了:
return (P[tag].red/32*32+(P[tag].green/32)*4+P[tag].blue/64);
用户 昵称
2002-10-23
打赏
举报
回复
HBITMAP LoadBitmap(
HINSTANCE hInstance, // handle to application instance
LPCTSTR lpBitmapName // address of bitmap resource name
);
BITMAPINFO * BitmapToDIB(HPALETTE hPal, // palette for color conversion
HBITMAP hBmp, // DDB for convert
int nBitCount, int nCompression) // format wanted
{
typedef struct
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256+3];
} DIBINFO;
BITMAP ddbinfo;
DIBINFO dibinfo;
// retrieve DDB information
if ( GetObject(hBmp, sizeof(BITMAP), & ddbinfo)==0 )
return NULL;
// fill out BITMAPINFOHEADER based on size and required format
memset(&dibinfo, 0, sizeof(dibinfo));
dibinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
dibinfo.bmiHeader.biWidth = ddbinfo.bmWidth;
dibinfo.bmiHeader.biHeight = ddbinfo.bmHeight;
dibinfo.bmiHeader.biPlanes = 1;
dibinfo.bmiHeader.biBitCount = nBitCount;
dibinfo.bmiHeader.biCompression = nCompression;
HDC hDC = GetDC(NULL); // screen DC
HGDIOBJ hpalOld;
if ( hPal )
hpalOld = SelectPalette(hDC, hPal, FALSE);
else
hpalOld = NULL;
// query GDI for image size
GetDIBits(hDC, hBmp, 0, ddbinfo.bmHeight, NULL, (BITMAPINFO *) & dibinfo, DIB_RGB_COLORS);
int nInfoSize = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * GetDIBColorCount(dibinfo.bmiHeader);
int nTotalSize = nInfoSize + GetDIBPixelSize(dibinfo.bmiHeader);
BYTE * pDIB = new BYTE[nTotalSize];
if ( pDIB )
{
memcpy(pDIB, & dibinfo, nInfoSize);
if ( ddbinfo.bmHeight != GetDIBits(hDC, hBmp, 0, ddbinfo.bmHeight, pDIB + nInfoSize, (BITMAPINFO *) pDIB, DIB_RGB_COLORS) )
{
delete [] pDIB;
pDIB = NULL;
}
}
if ( hpalOld )
SelectObject(hDC, hpalOld);
ReleaseDC(NULL, hDC);
return (BITMAPINFO *) pDIB;
}
BOOL SaveDIBToBmp(const char* pFileName, const BITMAPINFO *pBMI, const BYTE *pBits)
{
if(pFileName==NULL){
return FALSE;
}
HANDLE handle = CreateFile(pFileName, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(handle == INVALID_HANDLE_VALUE){
return FALSE;
}
BITMAPFILEHEADER bmFH;
int nHeadSize = sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * GetDIBColorCount(pBMI->bmiHeader);
bmFH.bfType = 0x4D42;
bmFH.bfSize = nHeadSize + GetDIBPixelSize(pBMI->bmiHeader);
bmFH.bfReserved1 = 0;
bmFH.bfReserved2 = 0;
bmFH.bfOffBits = nHeadSize + sizeof(BITMAPFILEHEADER);
DWORD dwRead = 0;
WriteFile(handle, & bmFH, sizeof(bmFH), & dwRead, NULL);
if(pBits==NULL) // packed DIB
pBits = (BYTE *) pBMI + nHeadSize;
WriteFile(handle, pBMI, nHeadSize, & dwRead, NULL);
WriteFile(handle, pBits, GetDIBPixelSize(pBMI->bmiHeader), & dwRead, NULL);
CloseHandle(handle);
return TRUE;
}
给下面函数nBitCount 传递8表示保存为256色位图
BITMAPINFO * BitmapToDIB(HPALETTE hPal, // palette for color conversion
HBITMAP hBmp, // DDB for convert
int nBitCount, int nCompression) // format wanted
yflc
2002-10-23
打赏
举报
回复
有没有直接对象素的RGB进行转换的算法?
zhlmnet2003
2002-10-22
打赏
举报
回复
24bit to 16bit
red = (truecolor>>8)&0xf800;
green = (truecolor>>5)&0x7e0;
blue = (truecolor>>3)&0x1f;
hicolor=red|green|blue;
yflc
2002-10-21
打赏
举报
回复
help
单色
位图
、
颜色
(色彩)
位图
相互
转换
SetBkColor The SetBkColor function sets the current background color to the specified color value, or to the nearest physical color if the device cannot represent the specified color value. COLORREF...
从真彩到256色或黑白
位图
:
颜色
转换
代码详解
颜色
量化是图像处理领域中一项重要技术,它通过减少一幅图像的
颜色
数来降低图像存储需求和提高处理速度。通常在
颜色
空间有限的设备上显示或处理图像时使用,例如早期的计算机显示系统和现代的网络图像传输等场景。在图像处理中,二值化是一种常用的图像分割技术,它可以将彩色或灰度图像
转换
为只有黑与白两种
颜色
的图像,这在文档扫描、前景物体提取等领域有着广泛的应用。二值化的关键技术在于阈值的选择,不同的阈值选择方法对最终结果有决定性的影响。
嵌入式GUI开发中emWin
位图
资源优化:
颜色
转换
、抖动技术与设备相关
位图
实战
在嵌入式系统开发中,图形用户界面(GUI)的实现常面临存储空间和运行性能的双重挑战,其中
位图
资源的管理尤为关键。
位图
优化的核心原理在于通过减少色深(如从24位真彩色降至8位索引色)来压缩数据量,并利用抖动技术(Dithering)在有限
颜色
下模拟丰富细节,从而在视觉质量与资源占用间取得平衡。从技术价值看,这不仅直接减少了ROM占用,更通过生成设备相关
位图
(DDB)避免了运行时的
颜色
转换
开销,大幅提升绘制性能。这些优化手段广泛应用于对资源敏感的嵌入式设备,如工业HMI、智能家居面板和便携式医疗仪器等场景。本文
Visual C++ 实现
位图
颜色
转换
与图像处理技术
真彩色
位图
(True Color Bitmap)是能够显示数百万种
颜色
的
位图
格式。这种格式通常拥有24位或32位
颜色
深度,允许每个像素使用R、G、B三个
颜色
通道,每个通道8位,能表示从黑色(全0)到白色(全255)的连续色彩。
颜色
映射是图像处理中一个重要的概念,它允许我们根据需要调整图像的
颜色
,以达到增强视觉效果、数据压缩或其他图像处理的目的。在图像处理中,有时候需要根据特定需求进行自定义
颜色
转换
。这种
转换
不是预先定义好的标准方法,而是基于项目的实际需要而定制。
政府科技管理人员如何通过产业大脑实现产业政策精准匹配与兑现?.docx
政府科技管理人员如何通过产业大脑实现产业政策精准匹配与兑现?
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章