社区
图形处理/算法
帖子详情
500分!!!寻24bitBMP转换为256色BMP实现方法
nasco
2003-05-01 08:05:26
对图形学狗P不懂,望帮助。
转换为256色黑白的不要。
请给出实现,最好提供单一的文件名为参数的函数实现。比如
int BmpConv(char *pSrcFileName,char *pDesFileName)
(对图形一点不懂,什么gdi/dib/rgb,一点不懂)
此题500分,如果不够,可以再给。先来先得
...全文
69
6
打赏
收藏
500分!!!寻24bitBMP转换为256色BMP实现方法
对图形学狗P不懂,望帮助。 转换为256色黑白的不要。 请给出实现,最好提供单一的文件名为参数的函数实现。比如 int BmpConv(char *pSrcFileName,char *pDesFileName) (对图形一点不懂,什么gdi/dib/rgb,一点不懂) 此题500分,如果不够,可以再给。先来先得
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nasco
2003-05-02
打赏
举报
回复
楼上的兄弟,请给我发消息,领取余下的分数。谢谢!
nasco
2003-05-02
打赏
举报
回复
谢谢,给分了!
mostneed(黙黙) 80%
Skt32(Skt32) 20%
再次感谢!
mostneed
2003-05-01
打赏
举报
回复
http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=3
真彩位图转化成256彩色或黑白位图的代码 详细信息 < 图像格式 >
一个效果非常好的24,16bit真彩位图转化成256彩色或黑白位图的演示程序代码,其中调用了一个动态连接库。
作者邮箱:akiy@eyou.com
[代码性质] VC完整应用程序代码
[代码作者] 胡志国
[文件大小] 27K
[更新日期] 2002-11-17 19:24:00
Skt32
2003-05-01
打赏
举报
回复
着两个试试看
Skt32
2003-05-01
打赏
举报
回复
void GrayConversionXu(HDIB& hDib)
{
HDIB hGreyDIB=NULL;
DWORD nWide,nHeight,i,j;
LPBYTE lpBit=(LPBYTE)GlobalLock(hDib);
LPBITMAPINFOHEADER pHeader=(LPBITMAPINFOHEADER)lpBit;
nWide=pHeader->biWidth;
nHeight=pHeader->biHeight;
DWORD dGrayDIBSize;
if(IS_WIN30_DIB(lpBit))
dGrayDIBSize=pHeader->biSize+256*sizeof(RGBQUAD)+(nWide*8+31)/32*4*nHeight;
else
dGrayDIBSize=pHeader->biSize+256*sizeof(RGBTRIPLE)+(nWide*8+31)/32*4*nHeight;
hGreyDIB=(HDIB)GlobalAlloc(GHND,dGrayDIBSize);
LPBITMAPINFO lpGray=(LPBITMAPINFO)GlobalLock(hGreyDIB);
lpGray->bmiHeader=*pHeader;
lpGray->bmiHeader.biBitCount=8;
if(IS_WIN30_DIB(lpBit))
for(i=0;i<256;i++)
{
lpGray->bmiColors[i].rgbBlue=(BYTE)i;
lpGray->bmiColors[i].rgbGreen=(BYTE)i;
lpGray->bmiColors[i].rgbRed=(BYTE)i;
lpGray->bmiColors[i].rgbReserved=(BYTE)0;
}
else
for(i=0;i<256;i++)
{
lpGray->bmiColors[i].rgbBlue=(BYTE)i;
lpGray->bmiColors[i].rgbGreen=(BYTE)i;
lpGray->bmiColors[i].rgbRed=(BYTE)i;
}
LPBYTE lpGrayBit=(LPBYTE)lpGray;
if(IS_WIN30_DIB(lpBit))
lpGrayBit+=pHeader->biSize+256*sizeof(RGBQUAD);
else
lpGrayBit+=pHeader->biSize+256*sizeof(RGBTRIPLE);
int nCountBit=pHeader->biBitCount;
if(nCountBit>8)
{
lpBit+=sizeof(BITMAPINFOHEADER);
int nRGB=(nWide*nCountBit+31)/32*4-nWide*nCountBit/8;
int nGrey=(nWide*8+31)/32*4-nWide;
for(i=0;i<nHeight;i++)
{
for(j=0;j<nWide;j++)
*lpGrayBit++=(*lpBit++)*0.299+(*lpBit++)*0.587+(*lpBit++)*0.114;
lpGrayBit+=nGrey;
lpBit+=nRGB;
}
::GlobalUnlock((HGLOBAL)hDib);
::GlobalFree((HGLOBAL)hDib);
hDib = hGreyDIB;
::GlobalUnlock((HGLOBAL)hGreyDIB);
}
else
{
DWORD nColorCount=1<<nCountBit;
BYTE pGreyTable[256];
RGBQUAD pDIBColors[256];
LPBITMAPINFO lpBitmapinfo=(LPBITMAPINFO)lpBit;
for(i=0;i<nColorCount;i++)
{
if(IS_WIN30_DIB(lpBit))
{
pDIBColors[i].rgbBlue=lpBitmapinfo->bmiColors[i].rgbBlue;
pDIBColors[i].rgbGreen=lpBitmapinfo->bmiColors[i].rgbGreen;
pDIBColors[i].rgbRed=lpBitmapinfo->bmiColors[i].rgbRed;
pDIBColors[i].rgbReserved=lpBitmapinfo->bmiColors[i].rgbReserved;
}
else
{
pDIBColors[i].rgbBlue=lpBitmapinfo->bmiColors[i].rgbBlue;
pDIBColors[i].rgbGreen=lpBitmapinfo->bmiColors[i].rgbGreen;
pDIBColors[i].rgbRed=lpBitmapinfo->bmiColors[i].rgbRed;
}
pGreyTable[i]=pDIBColors[i].rgbBlue*0.114+pDIBColors[i].rgbRed*0.299+pDIBColors[i].rgbGreen*0.587;
}
lpBit=lpBit+sizeof(BITMAPINFOHEADER)+PaletteSize(lpBit);
int nRGB=(nWide*nCountBit+31)/32*4-(nWide*nCountBit)/8;
int nGrey=(nWide*8+31)/32*4-nWide;
switch(nColorCount)
{
case 2:
for(i=0;i<nHeight;i++)
{
for(j=0;j<nWide;j++)
{
BYTE n=1<<(7-j%8);
BYTE Temp=*(BYTE*)lpBit;
Temp&=n;
*lpGrayBit++=pGreyTable[Temp>>(7-j%8)];
if((j+1)%8==0)lpBit++;
}
lpGrayBit+=nGrey;
lpBit+=nRGB;
}
break;
case 16:
for(i=0;i<nHeight;i++)
{
for(j=0;j<nWide;j++)
{
BYTE Temp=*lpBit;
BYTE n=j%2 ?0x0f:0xf0;
Temp&=n;
Temp=Temp>>(j%2 ?0:4);
*lpGrayBit++=pGreyTable[Temp];
if((j+1)%2==0)lpBit++;
}
lpGrayBit+=nGrey;
lpBit+=nRGB;
}
break;
case 256:
for(i=0;i<nHeight;i++)
{
for(j=0;j<nWide;j++)
*lpGrayBit++=pGreyTable[(*lpBit++)];
lpGrayBit+=nGrey;
lpBit+=nRGB;
}
break;
}
::GlobalUnlock((HGLOBAL)hDib);
::GlobalFree((HGLOBAL)hDib);
hDib = hGreyDIB;
::GlobalUnlock((HGLOBAL)hGreyDIB);
}
}
Skt32
2003-05-01
打赏
举报
回复
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
BMP
24
位图转16位位图的程序
然而,在某些应用场景下,如嵌入式系统或移动设备,为了节省存储空间和处理速度,可能需要将
24
位
BMP
图像
转换
为16位
BMP
图像。 16位
BMP
图像通常采用565格式,即每个像素由5位红
色
、6位绿
色
和5位蓝
色
组成,总计可表示...
24
位图转16位图工具
“
24
位图转16位图工具”正是针对这种需求设计的,它允许用户批量
转换
指定目录下的所有
24
位
BMP
图像为16位格式。这个过程通常涉及到
色
彩量化,即将
24
位
色
彩空间中的颜
色
映射到16位
色
彩空间的过程。算法会优化颜
色
分
配...
24
bit
BMP
图像的直方图显示
对于
24
位图像,我们可以为每个颜
色
通道(红、绿、蓝)创建一个
256
级的直方图数组,因为每个通道有8位,可以表示0到255共
256
个级别。对于每个像素,我们
分
别增加其RGB值对应的直方图计数。 4. **绘制直方图**:根据...
C++在内存中将
bmp
转JPG
在C++编程环境中,将
BMP
图像
转换
为JPG格式是一项常见的任务,特别是在处理大量图像或需要节省存储空间时。本篇文章将详细讲解如何在VS2013中使用MFC(Microsoft Foundation Classes)和OpenCV库来
实现
这个功能。...
Java读取所有
色
bmp
图片格式
4位
BMP
可以表示16种颜
色
,8位
BMP
可以表示
256
种颜
色
,而
24
位
BMP
则支持超过1600万种颜
色
,即真彩
色
。在读取这些不同颜
色
深度的
BMP
时,我们需要根据颜
色
深度解析相应的像素数据。 `
Bmp
Util`工具类的
实现
通常会包含以下...
图形处理/算法
19,466
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章