社区
图形处理/算法
帖子详情
急急!!真彩色位图转换为256色位图
蜗牛老嗲
2007-05-05 05:07:39
在视图中获得了一个位图的句柄,但是这个位图是32位的,现在要转换成8位位图,由于对位图还不是很熟悉,看了几天资料还是没有头绪,希望各位大侠帮忙,这是我的毕业设计,是一个手写数字的识别
...全文
4994
11
打赏
收藏
急急!!真彩色位图转换为256色位图
在视图中获得了一个位图的句柄,但是这个位图是32位的,现在要转换成8位位图,由于对位图还不是很熟悉,看了几天资料还是没有头绪,希望各位大侠帮忙,这是我的毕业设计,是一个手写数字的识别
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
蜗牛老嗲
2007-05-13
打赏
举报
回复
时间太紧了 ,只好换另一个方法了 ,谢谢大家了
wuqiaowuqiao
2007-05-10
打赏
举报
回复
http://www.vbgood.com/viewthread.php?tid=53287&extra=page%3D1&page=4
nf3
2007-05-10
打赏
举报
回复
收藏
圆圆木公
2007-05-08
打赏
举报
回复
CXImage类库中直接调用就好了,简单直接!!
HaiXingYu
2007-05-08
打赏
举报
回复
你可以选出图像中出现最多的颜色数进行量化...然后构造调色板..不过效果不好..
如果你要是抓换成灰度图的话,用转换公式,网上都有....
「已注销」
2007-05-05
打赏
举报
回复
你去网上搜搜吧,这个代码网上到处是
蜗牛老嗲
2007-05-05
打赏
举报
回复
能把CreateOctreePalette()这个函数的实现告诉我,
蜗牛老嗲
2007-05-05
打赏
举报
回复
24位与32位有什么区别吗,
「已注销」
2007-05-05
打赏
举报
回复
这是一个24TO256的源码,你看看
LONG i;
//24位位图的BITMAPINFO结构指针
LPBITMAPINFO lpSrcbmi;
//256色位图的BITMAPINFO结构指针
LPBITMAPINFO lpbmi = NULL;
//指向24色位图的像素的指针
LPSTR lpSourceBits;
//指向256色位图的像素的指针
LPSTR lpTargetBits;
//指向256色DIB的指针
LPSTR lpNewDIB;
//设备上下问句柄
HDC hDC ;
HDC hSourceDC;
HDC hTargetDC;
//位图句柄
HBITMAP hSourceBitmap;
HBITMAP hTargetBitmap;
HBITMAP hOldTargetBitmap;
HBITMAP hOldSourceBitmap;
//位图大小
DWORD dwSourceBitsSize, dwTargetBitsSize;
//256色位图信息头大小
DWORD dwTargetHeaderSize;
//256色位图句柄
HDIB hNewDIB;
DWORD dwSize;
//位图的高度、宽度
LONG lWidth, lHeight;
//指向24位位图的指针
LPSTR lpDIB;
//位图的颜色数
WORD wNumColors;
//调色板句柄
HPALETTE hPal;
//调色板颜色数组
PALETTEENTRY pe[256];
//获取位图句柄
HDIB hDIB=pDoc->GetHDIB();
//锁定句柄
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB );
//位图颜色数
wNumColors=::DIBNumColors(lpDIB);
//判断是否是24位位图
if (wNumColors!=0)
{
AfxMessageBox("不是24色位图");
::GlobalUnlock((HGLOBAL)hDIB);
return ;
}
lpSrcbmi = (LPBITMAPINFO)lpDIB;
lWidth = lpSrcbmi->bmiHeader.biWidth;
lHeight = lpSrcbmi->bmiHeader.biHeight;
//256色位图信息头大小+调色板大小
dwTargetHeaderSize = sizeof( BITMAPINFO ) +
( 256 * sizeof( RGBQUAD ) );
//分配内存
lpbmi = (LPBITMAPINFO)malloc( dwTargetHeaderSize );
//填充256色位图信息头
lpbmi->bmiHeader.biSize =sizeof( BITMAPINFOHEADER );
lpbmi->bmiHeader.biWidth = lWidth;
lpbmi->bmiHeader.biHeight = lHeight;
lpbmi->bmiHeader.biPlanes = 1;
lpbmi->bmiHeader.biBitCount = 8;
lpbmi->bmiHeader.biCompression = BI_RGB;
lpbmi->bmiHeader.biSizeImage = 0;
lpbmi->bmiHeader.biXPelsPerMeter = 0;
lpbmi->bmiHeader.biYPelsPerMeter = 0;
lpbmi->bmiHeader.biClrUsed = 0;
lpbmi->bmiHeader.biClrImportant = 0;
BeginWaitCursor();
//用八叉树算法生成256 色调色板
hPal =::CreateOctreePalette(lpDIB, 256, 8);
//是否创建成功
if (! hPal)
{
return;
}
//获取调色板表项
::GetPaletteEntries(hPal,0,256,pe);
//拷贝调色板
for(i=0;i<256;i++)
{
lpbmi->bmiColors[i].rgbRed=pe[i].peRed;
lpbmi->bmiColors[i].rgbGreen=pe[i].peGreen;
lpbmi->bmiColors[i].rgbBlue=pe[i].peBlue;
lpbmi->bmiColors[i].rgbReserved=0;
}
hDC =::GetDC( NULL );
//创建位图
hTargetBitmap = CreateDIBSection( hDC, lpbmi,
DIB_RGB_COLORS, (VOID **)&lpTargetBits, NULL, 0 );
hSourceBitmap = CreateDIBSection( hDC, lpSrcbmi,
DIB_RGB_COLORS,(VOID **)&lpSourceBits, NULL, 0 );
//创建24位位图的内存DC
hSourceDC = CreateCompatibleDC( hDC );
//创建256色位图的内存DC
hTargetDC = CreateCompatibleDC( hDC );
//24位位图的大小
dwSourceBitsSize = lpSrcbmi->bmiHeader.biHeight * WIDTHBYTES(lWidth*24);
//256色位图的大小(8位)
dwTargetBitsSize = lpbmi->bmiHeader.biHeight * WIDTHBYTES(lWidth*8);
//拷贝24位位图的像素值
memcpy( lpSourceBits, FindDIBBits(lpDIB), dwSourceBitsSize );
lpbmi->bmiHeader.biSizeImage = dwTargetBitsSize;
//选入内存DC
hOldSourceBitmap = (HBITMAP)SelectObject( hSourceDC, hSourceBitmap );
hOldTargetBitmap = (HBITMAP)SelectObject( hTargetDC, hTargetBitmap );
//给256色位图的内存DC赋颜色表
SetDIBColorTable( hTargetDC, 0, 256, lpbmi->bmiColors );
//*************************************************//
//注意该函数除了经常用于在屏幕上画位图以外,还有一个//
//特别的功能,就是原位图的颜色格式按照目标位图的颜色//
//格式转化,在这里实现了24位位图格式到8位位图格式的 //
//转化,在本程序中是非常关键的一步。 //
//**************************************************//
BitBlt( hTargetDC, 0, 0, lWidth, lHeight, hSourceDC, 0, 0, SRCCOPY );
//选入原来的对象
SelectObject(hSourceDC,hOldSourceBitmap);
SelectObject(hTargetDC,hOldTargetBitmap);
//删除创建的DC
DeleteDC(hSourceDC);
DeleteDC(hTargetDC);
::ReleaseDC(NULL,hDC);
//刷新屏幕显示
GdiFlush();
dwSize = dwTargetHeaderSize + dwTargetBitsSize;
//为256色位图分配内存
hNewDIB = (HDIB)::GlobalAlloc(GHND, dwSize);
//分配失败
if(hNewDIB==NULL)
{
return ;
}
lpNewDIB =(char*) ::GlobalLock((HGLOBAL)hNewDIB);
//拷贝256色位图的信息头和调色板
memcpy( lpNewDIB, lpbmi, dwTargetHeaderSize );
//拷贝256色位图的像素值
memcpy( FindDIBBits( lpNewDIB ), lpTargetBits, dwTargetBitsSize );
//删除对象
DeleteObject(hSourceBitmap);
DeleteObject(hTargetBitmap);
free(lpbmi);
//用256色替换24位位图
pDoc->ReplaceHDIB((HDIB)hNewDIB);
pDoc->InitDIBData();
pDoc->SetModifiedFlag(TRUE);
//实现256色位图的调色板
OnDoRealize((WPARAM)m_hWnd,0);
pDoc->UpdateAllViews(NULL);
EndWaitCursor();
::GlobalUnlock((HGLOBAL) hDIB);
songyuanwc
2007-05-05
打赏
举报
回复
顶楼上
很容易的
laviewpbt
2007-05-05
打赏
举报
回复
首先是计算你的8位色的调色板,这要看你用什么算法
然后设置调色板数据,在将真彩色数据隐射为调色板的索引值,一般还要考虑抖动!
YOLO算法卫星影像河流目标检测数据集-407张-包含 VOC 和 Yolo 格式标签-支持多种算法训练模型.zip
页面底部可查看数据集可视化效果; 该数据集可直接接入YOLOv5s/v5m/v5l、YOLOv8n/v8s/v8m、YOLOv10n/v10s、yolo11等轻量级至中型骨干网络进行端到端训练,支持从零训练(from scratch)与迁移学习(fine-tuning)两种模式;可直接使用
YOLO算法科技展厅展品目标检测数据集-563张-包含 VOC 和 Yolo 格式标签-支持多种算法训练模型.zip
页面底部可查看数据集可视化效果; 该数据集可直接接入YOLOv5s/v5m/v5l、YOLOv8n/v8s/v8m、YOLOv10n/v10s等轻量级至中型骨干网络进行端到端训练,支持从零训练(from scratch)与迁移学习(fine-tuning)两种模式
YOLO算法山区城市监控烟雾目标检测数据集-319张-包含 VOC 和 Yolo 格式标签-支持多种算法训练模型.zip
页面底部可查看数据集可视化效果; 该数据集可直接接入YOLOv5s/v5m/v5l、YOLOv8n/v8s/v8m、YOLOv10n/v10s、yolo11等轻量级至中型骨干网络进行端到端训练,支持从零训练(from scratch)与迁移学习(fine-tuning)两种模式;包含voc格式和yolo格式标签可直接使用
YOLO算法室内家居场景垃圾桶目标检测数据集-586张-包含 VOC 和 Yolo 格式标签-支持多种算法训练模型.zip
页面底部可查看数据集可视化效果; 该数据集可直接接入YOLOv5s/v5m/v5l、YOLOv8n/v8s/v8m、YOLOv10n/v10s等轻量级至中型骨干网络进行端到端训练,支持从零训练(from scratch)与迁移学习(fine-tuning)两种模式
Dify Java Client 是一个用于与 Dify 平台进行交互的 Java 客户端库 它提供了对 Dify 应用 API 和知识库 API 的完整支持,让 Java 开发者能够轻松地将 Dif
Dify Java Client 是一个用于与 Dify 平台进行交互的 Java 客户端库。它提供了对 Dify 应用 API 和知识库 API 的完整支持,让 Java 开发者能够轻松地将 Dify 的生成式 AI 能力集成到自己的应用中。
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章