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 打赏 收藏 转发到动态 举报
写回复
用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

19,466

社区成员

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

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