首先讲一下我转灰度图的原因,就是为了减少图片占的体积(32位色的每张图片都上M)
其次有个朋友已经给我提了个类似的解决方法
void ConvertToGray24(CBitmap *pBmp)
{
LPBYTE lpbits = NULL;
lpbits = new BYTE[BITS24];
if (!lpbits)
return;
ZeroMemory(lpbits, BITS24);
pBmp->GetBitmapBits(BITS24, lpbits);
for (int index = 0, j = 0, k = 0; index < BITS24; index ++)
{
lpbits[index] = (BYTE)(0.114 * lpbits[index]);
j = index + 1; k = index + 2;
lpbits[j] = (BYTE)(0.587 * lpbits[j]);
lpbits[k] = (BYTE)(0.299 * lpbits[k]);
lpbits[index] += lpbits[j] + lpbits[k];
lpbits[j] = lpbits[index];
lpbits[k] = lpbits[index];
index = k;
}
pBmp->SetBitmapBits(BITS24, lpbits);
delete [] lpbits;
}但是我觉得不行,因为他只是把RGB三位都改成了灰度处理过的那个值,并没有减少体积啊....
所以想找个解决的方法(32位--->1位,4位,16位都OK)
其次有个朋友已经给我提了个类似的解决方法
void ConvertToGray24(CBitmap *pBmp)
{
LPBYTE lpbits = NULL;
lpbits = new BYTE[BITS24];
if (!lpbits)
return;
ZeroMemory(lpbits, BITS24);
pBmp->GetBitmapBits(BITS24, lpbits);
for (int index = 0, j = 0, k = 0; index < BITS24; index ++)
{
lpbits[index] = (BYTE)(0.114 * lpbits[index]);
j = index + 1; k = index + 2;
lpbits[j] = (BYTE)(0.587 * lpbits[j]);
lpbits[k] = (BYTE)(0.299 * lpbits[k]);
lpbits[index] += lpbits[j] + lpbits[k];
lpbits[j] = lpbits[index];
lpbits[k] = lpbits[index];
index = k;
}
pBmp->SetBitmapBits(BITS24, lpbits);
delete [] lpbits;
}但是我觉得不行,因为他只是把RGB三位都改成了灰度处理过的那个值,并没有减少体积啊....
所以想找个解决的方法(32位--->1位,4位,16位都OK)
解决方案 »
- MFC对话框编程中,在对话框类中的头文件中的类声明中,声明几个变量出现问题
- 自己建立了一个scoket类,监听时accept为什么没有阻塞
- 语音的压缩和编码
- 如何防止数据丢失
- 请问:什么是“字节串”呀。。它与“字符串”有什么不一样>>>
- 初学者的困惑!
- 执行语句 (CMDIFrameWnd*)pMainFrame->UpdateWindow() 后,是先发 WM_PAINT 消息还是 OnDraw 消息?也就是说,是先执行OnDraw 还是先执行 OnPaint 函数?还是只执行其中一个函数?
- 请教TCP/IP通信的入门问题
- 关于内幕第4版第18页的程序的问题,第一个MFC程序啊
- 滤波之后,为什么图片尺寸,变了
- 关于线程摧毁的问题
- 被逼无奈-寻找开发高手
大家不要嫌分少就不进来啊,那可是我仅有的20分啊,我以前向来就是100,100给的,最少也是50
{
FILE *fp = fopen("test.bmp","rb");
if(!fp)return; BITMAPFILEHEADER hdr;
fread(&hdr,1,sizeof(hdr),fp); if(!(((hdr.bfType & 0xff) == 'B') && ((hdr.bfType >> 8) == 'M')))
{
fclose(fp);
return;
} BITMAPINFOHEADER bih; fread(&bih,1,sizeof(bih),fp); if(bih.biBitCount != 24 || bih.biCompression != 0)
{
fclose(fp);
return;
} unsigned char *pBuf = new unsigned char[bih.biSizeImage]; fread(pBuf,bih.biSizeImage,sizeof(unsigned char),fp);
FILE *out = fopen("testout.bmp","wb");
if(!out)
{
delete []pBuf;
fclose(fp);
return;
} unsigned char *pOutBuf = new unsigned char[bih.biWidth * bih.biHeight];
unsigned char *tmp = pBuf;
unsigned char *tmp2 = pOutBuf;
for(unsigned int i = 0; i < bih.biWidth * bih.biHeight;i++)
{
tmp2[i] = (unsigned char)((*tmp) * .114 + *(tmp + 1) * .587 + *(tmp + 2) * .299);
tmp += 3;
} RGBQUAD q[256];
for( i = 0; i < 256; i++)
{
q[i].rgbRed = q[i].rgbGreen = q[i].rgbBlue = i;
q[i].rgbReserved = 0;
} bih.biBitCount = 8;
bih.biSizeImage = bih.biWidth * bih.biHeight; hdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ sizeof(q) + bih.biSizeImage;
hdr.bfOffBits += sizeof(q); fwrite(&hdr,1,sizeof(hdr),out);
fwrite(&bih,1,sizeof(bih),out);
fwrite(q,256,sizeof(RGBQUAD),out);
fwrite(pOutBuf,bih.biSizeImage,sizeof(unsigned char),out); delete []pOutBuf;
fclose(out);
delete []pBuf;
fclose(fp);
}