| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2438 人关注过本帖
标题:800X600X256色下24K真彩色BMP图片为什么显示不出来?(本子程序256色BMP图片 ...
只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
 问题点数:0 回复次数:11 
800X600X256色下24K真彩色BMP图片为什么显示不出来?(本子程序256色BMP图片显示正

请帮忙指导一下,我查阅了好多资料都找不到正解!

/*第一部分为位图文件头BITMAPFILEHEADER,其定义如下:*/
typedef struct tagBITMAPFILEHEADER
{
unsigned int bfType; /*指定文件类型,*.bmp文件的头两个字节都是"BM"*/
unsigned long bfSize; /*指定文件大小,包括这14个字节*/
unsigned int Reserved1; /*为保留字,不用考虑*/
unsigned int reserved2; /*为保留字,不用考虑*/
unsigned long bfOffset; /*为从文件头到实际的位图数据的偏移字节数,前三个部分的长度之和。*/
}BITMAPFILEHEADER;

/*第二部分为位图信息头BITMAPINFOHEADER,这个结构的长度是固定的,为40个字节其定义如下:*/
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize; /*指定这个结构的长度,为40*/
unsigned long biWidth; /*指定图象的宽度,单位是象素*/
unsigned long biHeight; /*指定图象的高度,单位是象素*/
unsigned int biPlanes; /*必须是1,不用考虑*/
unsigned int biBitCount; /*指定表示颜色时要用到的位数,常用的值为1(黑白二色图),4(16色图),8(256色),24(真彩色图)*/
unsigned long biCompression; /*指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS*/
unsigned long biSizeImage; /*指定实际的位图数据占用的字节数*/
unsigned long biXpolsPerMeter; /*指定目标设备的水平分辨率,单位是每米的象素个数。*/
unsigned long biYpelsPerMeter; /*指定目标设备的垂直分辨率,单位同上。*/
unsigned long biClrUsed; /*指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次方。*/
unsigned long biClrImportant; /*指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。*/
}BITMAPINFOHEADER;


typedef struct tagRGBQUAD /*用于读取调色板信息*/
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char Reserved;
}RGBQUAD;

typedef struct tagRGB
{
unsigned char r;
unsigned char g;
unsigned char b;
}RGB24;


我依照NEO的子程序,可是24K的BMP图片显示不出来,请指点?

#define SRGB332(r, g, b) ((((r) / 9) << 5) + (((g) / 9)<<2) + (b) / 21)

void Show_BMP(char *File_Name, int x, int y)
{
int i, j, width, color,len;
FILE *fp;
unsigned char *buffer;
RGB24 *RGB_buffer;
RGBQUAD *RGB;
BITMAPFILEHEADER *FileHead;
BITMAPINFOHEADER *InfoHead;

if ((fp=fopen(File_Name,"rb")) == NULL)
{
printf("BMP File not exist ...");
return;
}
RGB = (RGBQUAD *)malloc(sizeof(RGBQUAD));
FileHead = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
InfoHead = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));
fread(FileHead,sizeof(BITMAPFILEHEADER),1,fp);
if (FileHead->bfType!='BM')
{
printf("BMP File type Error ...");
return;
}
fread(InfoHead,sizeof(BITMAPINFOHEADER),1,fp);
if (InfoHead->biCompression !=0 || (InfoHead->biBitCount!=8 && InfoHead->biBitCount!=24))
{
printf("BMP File not Support Compression type ...");
fclose(fp);
return;
}
width =((int)InfoHead->biWidth+3)/4*4; // 每行字节数--4的整数倍
if ((buffer = (unsigned char *)malloc(width)) == NULL) // 申请缓冲区
{
fclose(fp);
return;
}
if ((int)InfoHead->biBitCount == 8) // 色深=8
{
for (i = 0 ; i < 256 ; i++)
{
fread(RGB,sizeof(RGBQUAD),1,fp);
outportb(0x3C8,i);
outportb(0x3C9,RGB->rgbRed>>2);
outportb(0x3C9,RGB->rgbGreen>>2);
outportb(0x3C9,RGB->rgbBlue>>2);
}
for (j = (int)InfoHead->biHeight-1 ; j >= 0 ; j--)
{
fread(buffer,width,sizeof(unsigned char),fp);
for (i = 0; i < width; i++)
PutPixel(i+x,j+y,buffer[i]);
}
}
else if ((int)InfoHead->biBitCount == 24) // 色深=24
{
len=(int)InfoHead->biWidth*sizeof(RGB24)+(int)InfoHead->biWidth&3;
if ((RGB_buffer = (RGB24 *)malloc(len)) == NULL)
{
fclose(fp);
return;
}
for (j = (int)InfoHead->biHeight-1 ; j >= 0 ; j--)
{
fread(RGB_buffer,len,sizeof(char),fp); /*读取该行像素的所有点的颜色*/
for (i=0;i<len;i++)
{
color = SRGB332(RGB_buffer[i].r,RGB_buffer[i].g,RGB_buffer[i].b);
PutPixel(i+x,j+y,color);
}
}

}
free(FileHead);
free(InfoHead);
free(RGB);
}

搜索更多相关主题的帖子: BMP 彩色 unsigned int 
2007-01-24 15:34
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 

你得到的是什么错误,还是只是显示的不正确?

2007-01-24 17:03
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
256色的BMP图片本子程序能显示出来,而且显示正确,只是24K的BMP图片显示不出来,屏幕是黑的。最后按一键后,能够返回。

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-01-24 17:41
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 

256色的BMP图片本子程序能显示出来,而且显示正确,只是24K的BMP图片显示不出来,也就是当色深=24时,图片显示不出来,屏幕是黑的,程序没有错误,只是24K图片处理不正确(不知道如何处理),导致图片无法正确显示。
  以下是色深=24时的程序片段:
typedef struct tagRGB
{
unsigned char r;
unsigned char g;
unsigned char b;
}RGB24;

#define SRGB332(r, g, b) ((((r) / 9) << 5) + (((g) / 9)<<2) + (b) / 21)
RGB24 *RGB_buffer;

else if ((int)InfoHead->biBitCount == 24) // 色深=24
{
len=(int)InfoHead->biWidth*sizeof(RGB24)+(int)InfoHead->biWidth&3;
if ((RGB_buffer = (RGB24 *)malloc(len)) == NULL)//申请内存空间
{
fclose(fp);
return;
}
for (j = (int)InfoHead->biHeight-1 ; j >= 0 ; j--)// 图片高度循环
{
fread(RGB_buffer,len,sizeof(char),fp); /*读取该行像素的所有点的颜色*/
for (i=0;i<len;i++)//图片宽度循环
{
color = SRGB332(RGB_buffer[i].r,RGB_buffer[i].g,RGB_buffer[i].b);
PutPixel(i+x,j+y,color);
}
}
}


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-01-25 08:46
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
为什么24K真彩色BMP图片显示不出来了,有谁知道?

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-01-26 17:30
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
为什么24K真彩色BMP图片显示不出来了,有谁知道

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-01-30 16:41
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
收藏
得分:0 

你是想直接在32模式去现实显示还在想在256色下采用抖动法显示24位图片?

[此贴子已经被作者于2007-2-11 11:23:16编辑过]


个人网站 -  http://.h001.
2007-02-11 11:22
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
我想在256色下采用抖动法显示24位图片,由于首次接触MSDOS下编程显示BMP图片,因此很多概念不清楚,

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-02-12 08:46
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 

第一步:我用《XnView V1.4》软件将一幅24K真彩色BMP图片按照如下步骤:图像-->转换为彩色[C]-->256色抖动 后另存文件生成一幅新图片。
第二步:
  (1).定义一个宏makecol16
#define makecol16(r,g,b) ((((unsigned int)(r)>>3)<<11) + (((unsigned int)(g)>>2)<<5) + ((b)>>3))
(2).定义24K的RGB
typedef struct tagRGB16M /* 16M RGB像素类型 */
{
unsigned char Blue;
unsigned char Green;
unsigned char Red;
}RGB16M;
(3).然后将读出的三字节颜色(RGB)转换,往VRAM中填充
else if ((int)InfoHead->biBitCount == 24) // 色深=24(真彩色图片)
{
register RGB16M *buffer;
if ((buffer = malloc(width*sizeof(RGB16M))) == NULL)
{
fclose(fp);
return;
}
for (j = (int)InfoHead->biHeight-1 ; j >= 0 ; j--)
{
fread(buffer,width,sizeof(RGB16M),fp);
for (i = 0 ; i < width ; i++)
{
color = makecol16(buffer[i].Red,buffer[i].Green,buffer[i].Blue);
PutPixel(i,j,color);
}
}

}

还是显示花屏,请指出错误之处


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-02-12 10:48
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 

在256色视频模式下,显示24bit色bmp图片,方法如下:
可以不用XnView V1.4对图片进行处理,而在程序中直接进行处理:
1. 设置256色的调色板为332像素格式的调色板
2. 对24bit色bmp中的每一个像素进行转换:24bit(888) -> 8bit(332)
3. 将转换以后的8bit颜色值绘制到屏幕的正确位置上
3. 正确处理完图片中的每一个像素点,就ok了

RockCarry
2007-2-12

2007-02-12 11:18
快速回复:800X600X256色下24K真彩色BMP图片为什么显示不出来?(本子程序256色B ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029709 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved