社区
机器视觉
帖子详情
如何将24为位图转化为8位的?
tenyears
2003-10-16 08:55:25
现在在用vb6做程序,需要实现位图转换的功能,即将24位,32位,16位的彩色图片转化为8位的位图,不知如何处理,请大家帮忙。
...全文
217
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,448
社区成员
15,336
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章