c语言怎么计算bmp图像大小,C语言如何取出一张256色位的bmp图像的某个像素的颜色...
C语言怎么取出一张256色位的bmp图像的某个像素的颜色
我想实现的是:将一张256色位图的bmp图像(1.bmp)上下左右移动N个像素(比如向右移5个像素,最左边的5个像素全涂成黑色)生成另一张图像(2.bmp)。我现在写的有些问题:
代码:
#include
#include
int main()
{
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
FILE *pfin = fopen("F:\\1.bmp","rb");
FILE *pfout = fopen("F:\\2.bmp","wb");
fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);
fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);
int size = 512*512;
int i;
unsigned char img[512][512];
fread(img,sizeof(byte),size,pfin);
if(infoHeader.biBitCount == 8)
{
for(i=1;i<512;i++)
{
img[i][50]=0;
}
}
fwrite(&fileHeader,sizeof(fileHeader),1,pfout);
fwrite(&infoHeader,sizeof(infoHeader),1,pfout);
fwrite(img,sizeof(byte),size,pfout);
}
------解决思路----------------------
比如表示某个像素的值为0x12,找调色板中从0x00到0xff的第0x12项对应的RGB值。
------解决思路----------------------
//
// Bitmap 文件(压缩)格式
typedef enum tag_bmp_encode
{
bmp_encode_none = 0, // 未压缩
bmp_encode_rle8, // rle8压缩
bmp_encode_rle4, // rle4压缩
bmp_encode_mask, // 由掩码(color_mask_abgr_t)决定
// os2 压缩方式
bmp_encode_os2_index4, // OS/2 的 4 位编码
bmp_encode_os2_index8, // OS/2 的 8 位编码
bmp_encode_os2_24, // OS/2 的 24 位编码
}bmp_encode_e;
#pragma pack(push, 1)
//
// 简单的 Bitmap 文件头,用于识别 Bitmap 文件类型。
struct bmp_simple_header_t
{
uint_16 type;
uint_32 file_size;
uint_32 reserved;
uint_32 data_offset;
uint_32 info_size;
};
//
// Windows Bitmap 文件头
struct bmp_info_windows_t
{
uint_32 size;
int_32 width;
int_32 height;
uint_16 plane_count;
uint_16 bit_count;
bmp_encode_e encode;
uint_32 image_size;
int_32 ppm_x; // pels per meter
int_32 ppm_y;
uint_32 color_used;
uint_32 color_important;
};
struct bmp_header_windows_t
{
uint_16 type;
uint_32 file_size;
uint_32 reserved;
uint_32 data_offset;
};
bmp_simple_header_t + bmp_header_windows_t + bmp_info_windows_t
这是标准的 windows bitmap 的文件头结构。
下面是确认出 bitmap 文件的格式,
const uint_16 BMP_HEADER_ID = 0x4D42; // 'BM',header.type
bmp_simple_header_t * header = (bmp_simple_header_t *)buffer;
if(header->type != BMP_HEADER_ID)
return 1;
int_x width = 0;
int_x height = 0;
color_mode_e src_mode = color_mode_invalid;
byte_t * conv_palette = nullptr;
byte_t * conv_buffer = nullptr;
int_x flags = 0;
bmp_header_windows_t * header = (bmp_header_windows_t *)buffer;
buffer += sizeof(bmp_header_windows_t);
if(header->type != BMP_HEADER_ID)
return false;
bmp_info_windows_t * info = (bmp_info_windows_t *)buffer;
buffer += sizeof(bmp_info_windows_t);
if(info->size != sizeof(bmp_info_windows_t) && info->size != sizeof(bmp_info_windows_t)+sizeof(color_mask_abgr_t))
return false;
width = (int_x)info->width;
height = (int_x)info->height;
// 翻转行序
if(height
height = -height;
else
flags
------解决思路----------------------
= IMAGE_CONVERT_FLIP_Y;
// 调色板、颜色掩码等额外信息
int_x extern_size = header->data_offset - sizeof(bmp_info_windows_t)-sizeof(bmp_header_windows_t);
conv_palette = nullptr;
conv_buffer = buffer;
// 颜色掩码确定颜色类型
if(info->encode == bmp_encode_mask)
{
IMAGE_ASSERT(extern_size == sizeof(color_mask_abgr_t));
color_mask_abgr_t * mask = (color_mask_abgr_t *)buffer;
src_mode = color_mode_from_mask_abgr(mask, info->bit_count);
conv_buffer = buffer + extern_size;
conv_palette = nullptr;
}
// rle8 编码
else if(info->encode == bmp_encode_rle8)
{
src_mode = color_mode_index8_rle2_x8r8g8b8;
conv_buffer = buffer + extern_size;
conv_palette = buffer;
}
// rle4 编码
else if(info->encode == bmp_encode_rle4)
{
src_mode = color_mode_index4_rle2_x8r8g8b8;
conv_buffer = buffer + extern_size;
conv_palette = buffer;
}
// 有调色板
else if(extern_size)
{
src_mode = color_mode_invalid;
switch(info->bit_count)
{
case 1:
src_mode = color_mode_index1_x8r8g8b8;
break;
case 2:
src_mode = color_mode_index2_x8r8g8b8;
break;
case 4:
src_mode = color_mode_index4_x8r8g8b8;
break;
case 8:
src_mode = color_mode_index8_x8r8g8b8;
break;
default:
break;
}
conv_buffer = buffer + extern_size;
conv_palette = buffer;
}
else // 没有调色板
{
src_mode = color_mode_invalid;
switch(info->bit_count)
{
case 2:
src_mode = color_mode_gray2;
break;
case 4:
src_mode = color_mode_gray4;
break;
case 8:
src_mode = color_mode_gray8;
break;
case 16:
src_mode = color_mode_x1r5g5b5;
break;
case 24:
src_mode = color_mode_r8g8b8;
break;
case 32:
src_mode = color_mode_a8r8g8b8;
break;
default:
break;
}
conv_buffer = buffer;
conv_palette = nullptr;
}
其中,
case 8:
src_mode = color_mode_index8_x8r8g8b8;
break;
应该就是楼主的 8-bit 格式了,当然了读取就比较简单了
conv_palette 指向的是调色板,
conv_buffer 指向的是索引数据。
而将索引数据映射到调色板里就不用我说了吧,楼主自己会做了。
需要注意的是,调色板里的颜色格式是 x8r8g8b8。
跨度 pitch = align_to_4(width),需要 4 字节对齐。
c语言怎么计算bmp图像大小,C语言如何取出一张256色位的bmp图像的某个像素的颜色...相关推荐
- c语言怎么计算bool空间大小,c语言bool怎么用
1. C语言中BOOL命令的使用方法 1. 一般来说 bool 作为boolean类型来使用,不百是命令,是一种类型,表示度真/假. 2. C语言里面没有内bool(布尔)类型 C++里面才引入boo ...
- 256色无压缩BMP文件格式
256色的BMP文件分为 BMP文件头,BMP信息头,彩色表和位图信息矩阵4部分. BMP文件头结构; struct BITMAPFILEHEADER_ { short type;//---- ...
- 怎么计算管道的大小C语言,已知液面高度怎么计算圆形管道内液体截面积(圆弧面)的方法...
沙鸥成都 1.PNG (30.65 KB, 下载次数: 6) 2019-11-6 19:54 上传 这是一个流量测量计算测试设备的工程应用,假设一根大口径的圆形管道,在管道顶部安装了一个距离传感器,能 ...
- C语言zh字符串指针的大小,C语言的一些小技巧,小知识
1.用if(!strcmp(s1, s2)) 比较两个字符串等值,是否是个好风格? 这并不是个很好的风格, 虽然这是个流行的习惯用法.如果两个字符串相等, 这个测试返回为真, 但! ("非& ...
- c语言sizeof计算int字节数,c语言sizeof获取数据类型长度
先看代码在看说明和和结果会让人更多的更加纯粹的思考,同时减少多余词汇造成的负担,这里只通过int类型为例试验,其他类型雷同 注意在使用sizeof时与你系统是32位或者64位有关系,同时和你环境中编译 ...
- c语言浮点型与整形比较大小,C语言整形与浮点型转化过程中的精度损失
本篇文章主要解决的问题是C语言整形与浮点型转化过程中的精度损失从而容易产生bug,对于浮点和整形的相关内容大家可以参考下面两篇文章.,这里就不再赘叙了. 1整形与浮点转化的精度损失参考小程序:1#in ...
- 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节
C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...
- c语言潮流计算验证30节点,C语言潮流计算研究报告.doc
潮流计算研究报告 潮流计算概述 电力工业是国民经济的基础产业,为保证电力系统安全.稳定及可靠的运行,首先需计算电力系统网络潮流.潮流计算指根据给定的电力系统运行条件及系统接线情况确定整个电力系统各部分 ...
- c 语言比较三个整数大小,C 语言 —— 比较三个整数的大小并从大到小输出
思路一:定义两个比较大小的函数,依次两两比较输出最大或最小的数字(较为繁琐,最易分析) /* C 语言比较三个整数的大小并从大到小输出 思路:定义两个比较大小的函数,依次两两比较输出最大或最小的数字 ...
最新文章
- GIS 相关知识扫盲
- 通俗易懂!白话朴素贝叶斯
- python 为何要学16进制,从十六进制Python中的补
- 基于TerraExplorer Pro的校园三维浏览系统开发(转载)
- java局部变量简述
- python中read函数解释_Python内置函数解释教程,readwill(非常详细的代码演示截图),详解,看,了,就,会,很...
- 鏖战九载,Google 是否会因 Oracle 而弃用 Java?
- linux中vim中文显示乱码
- 01_测试基础知识---功能测试常用方法/正交表的使用
- vc6.0处理wps文字
- 轻松实现微信、QQ防撤回
- 怎么更改计算机用户开机密码,如何更改Windows开机密码?修改电脑开机密码教程...
- 【一起学Rust | 设计模式】新类型模式
- 搜索引擎优化SEO专业术语总结(新手篇)
- 00 Linux到底是什么?
- C51单片机的电子时钟(数码管显示)
- 微信发定位服务器地址,腾讯位置服务教你轻松搞定微信发送位置功能
- pandas 日期比较大小_pandas 对日期类型数据的处理
- outlook邮箱链接如何用ie打开_Outlook手机邮箱配置文档
- 第一时间安装试用中科红旗桌面操作系统V11