如何将24为位图转化为8位的?

tenyears 2003-10-16 08:55:25
现在在用vb6做程序,需要实现位图转换的功能,即将24位,32位,16位的彩色图片转化为8位的位图,不知如何处理,请大家帮忙。
...全文
211 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
HUNTON 2003-10-16
  • 打赏
  • 举报
回复
不知何时收集的:16位的转8位的
#include <time.h>
#include <conio.h>
#include <direct.h>
#include <string.h>
#include "windows.h"

void Trace( // 通过错略计算函数fun1,fun2的速度比较哪个在速度上最优
const char *msg, // 显示信息
DWORD cirtimes, // 循环次数
void (*fun1)(void),
void (*fun2)(void)
)
{
time_t dd;
DWORD i;
// 显示信息
printf("\n--------< %s",msg);
// 让程序抢占CPU,消除部分由于程序启动造成的干扰
printf("\n Full cpu...");
dd=time(0);
for(i=0;i<0x10000000;i++);
printf("%d",time(0)-dd);

// 粗略计算单循环需要的时间
printf("\n Circle...");
dd=time(0);
for(i=0;i<cirtimes;i++);
printf("%d",time(0)-dd);

printf("\n Process times = %d",cirtimes);

// 粗略计算fun1需要的时间
printf("\n Process fun1...");
dd=time(0);
for(i=0;i<cirtimes;i++)
(*fun1)();
printf("%d",time(0)-dd);

// 粗略计算fun2需要的时间
printf("\n Process fun2...");
dd=time(0);
for(i=0;i<cirtimes;i++)
(*fun2)();
printf("%d",time(0)-dd);
printf("\n--------< end\n");
}


#define TIM_TRY4 0xFF1 // 循环次数
// 图象显示区域
#define NES_DISP_WIDTH 256
#define NES_DISP_HEIGHT 240

// 存储图象的内存区域
BYTE pScreenMem[NES_DISP_WIDTH*NES_DISP_HEIGHT*2];

/* 经过计算得到的16真彩图象
需要将这个图象进行灰度化然后拷贝到存储图象的内存区域
*/
WORD workframe[NES_DISP_WIDTH*NES_DISP_HEIGHT];

/* 算法:
算法依据为:
已知某16真彩的象素数值为A, 由于16真彩采用15bit 即5,5,5表示红绿蓝
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|<-- 红 -->| |<-- 绿 -->| |<-- 蓝 -->|

设 红=R 绿=G 蓝=B
则:灰度级Gr=(R*0.299+G*0.587+B*0.114), 为了计算数度快,不采用浮点数,
即使用: Gr=(R*(0.299<<15)+G*(0.587<<15)+B*(0.114<<15))>>15
即: Gr= ( ( 9798*R + 19235*G + 3735*B)>>15);
则该象素的256灰度数值为RGB(Gr<<3,Gr<<3,Gr<<3);
需要得到的不是象素的256灰度数值RGB(Gr<<3,Gr<<3,Gr<<3);
而是以16真彩方式表示的数值即:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|<-- Gr -->| |<-- Gr -->| |<-- Gr -->|

*/

/* 算法1 */
void Tool4Fun1()
{
int x,y,idx=0;
DWORD R,G,B,Gr,wColor;
WORD *lpbuf=(WORD*)pScreenMem;
/* Exchange 16-bit to 256 gray */
for ( y = 0; y < NES_DISP_HEIGHT; y++ )
{
for ( x = 0; x < NES_DISP_WIDTH; x++ )
{
wColor = workframe[ ( y << 8 ) + x ];
R = ( ( wColor & 0x7c00 ) >>10 );
G = ( ( wColor & 0x03e0 ) >>5 );
B = ( ( wColor & 0x001f ) );
Gr= ( ( 9798*R + 19235*G + 3735*B)>>15);
lpbuf[idx]=(WORD)((Gr<<10)|(Gr<<5)|Gr);
idx++;
}
}
}

/* 算法2 */

void Tool4Fun2()
{
int x,y,idx=0;
DWORD R,G,B,wColor;
WORD Gr1,Gr2;
WORD *lpbuf=(WORD*)pScreenMem;
/* Exchange 16-bit to 256 gray */
for ( y = 0; y < NES_DISP_HEIGHT; y++ )
{
for ( x = 0; x < NES_DISP_WIDTH; x+=2 )
{
wColor = ((workframe[ ( y << 8 ) + x ])<<16)|(workframe[ ( y << 8 ) + x +1]);
R = ( wColor & 0x7c007c00 );
G = ( wColor & 0x03e003e0 );
B = ( wColor & 0x001f001f );
Gr1= (WORD)(( 9798*(R>>26) + 19235*(G>>21) + 3735*(B>>16))>>15);
Gr2= (WORD)(( 9798*((R&0xFFFF)>>10) + 19235*((G&0xFFFF)>>5) + 3735*((B&0xFFFF)) )>>15);
lpbuf[idx++]=((Gr1<<10)|(Gr1<<5)|Gr1);
lpbuf[idx++]=((Gr2<<10)|(Gr2<<5)|Gr2);
}
}
}

void Tool4()
{
Trace("Tool4",TIM_TRY4,&Tool4Fun1,&Tool4Fun2);
}


int main(int argc, char* argv[])
{
Tool4();
return 0;
}
zbstone 2003-10-16
  • 打赏
  • 举报
回复
直接使用v6还是使用工具啊
photoshop怎么样

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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