社区
机器视觉
帖子详情
如何将24为位图转化为8位的?
tenyears
2003-10-16 08:55:25
现在在用vb6做程序,需要实现位图转换的功能,即将24位,32位,16位的彩色图片转化为8位的位图,不知如何处理,请大家帮忙。
...全文
211
2
打赏
收藏
如何将24为位图转化为8位的?
现在在用vb6做程序,需要实现位图转换的功能,即将24位,32位,16位的彩色图片转化为8位的位图,不知如何处理,请大家帮忙。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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怎么样
24
位图
转为8
位图
的C++代码
24
位彩图转为
8位
灰度图的C++代码,通过修改
位图
文件信息头来实现
位图
转换。
24
位图
转8
位图
像
24
位图
转化
为8
位图
的C++代码,很好用的
源码-多格式
位图
转化
+简易画图
平台:DEV-C++ 5.8.3 语言:C++ 功能: 1)1、4、8(灰度、色彩)、16(565、555)、
24
、32位
位图
之间的相互
转化
。 2)生成简易的图形(生成图片,并按照坐标画点、线、圆。。。) 3)将
位图
转化
为坐标文件,供其他应用使用。 用途: 1)无特殊作用,写着玩。就是想用程序在坐标层次控制
位图
。 2)可用C++在源码级别生成
位图
,画个小画;读入
位图
数据,转换
位图
格式。 3)将图片
转化
为单片机开发能用到的液晶坐标文件。
实现
位图
文件
转化
为JPEG文件
实现
位图
文件
转化
为JPEG文件 实现
位图
文件
转化
为JPEG文件 实现
位图
文件
转化
为JPEG文件 实现
位图
文件
转化
为JPEG文件
32位
24
位彩图
转化
8位
灰度图工具
转化
后的图像保存在change.bmp中。里含大量BMP图片。如不能用,请给我要代码,我也是初学者,不知道能否兼容。
机器视觉
4,446
社区成员
15,335
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章