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图像的某个像素的颜色...相关推荐

  1. c语言怎么计算bool空间大小,c语言bool怎么用

    1. C语言中BOOL命令的使用方法 1. 一般来说 bool 作为boolean类型来使用,不百是命令,是一种类型,表示度真/假. 2. C语言里面没有内bool(布尔)类型 C++里面才引入boo ...

  2. 256色无压缩BMP文件格式

    256色的BMP文件分为 BMP文件头,BMP信息头,彩色表和位图信息矩阵4部分. BMP文件头结构; struct BITMAPFILEHEADER_ {     short type;//---- ...

  3. 怎么计算管道的大小C语言,已知液面高度怎么计算圆形管道内液体截面积(圆弧面)的方法...

    沙鸥成都 1.PNG (30.65 KB, 下载次数: 6) 2019-11-6 19:54 上传 这是一个流量测量计算测试设备的工程应用,假设一根大口径的圆形管道,在管道顶部安装了一个距离传感器,能 ...

  4. C语言zh字符串指针的大小,C语言的一些小技巧,小知识

    1.用if(!strcmp(s1, s2)) 比较两个字符串等值,是否是个好风格? 这并不是个很好的风格, 虽然这是个流行的习惯用法.如果两个字符串相等, 这个测试返回为真, 但! ("非& ...

  5. c语言sizeof计算int字节数,c语言sizeof获取数据类型长度

    先看代码在看说明和和结果会让人更多的更加纯粹的思考,同时减少多余词汇造成的负担,这里只通过int类型为例试验,其他类型雷同 注意在使用sizeof时与你系统是32位或者64位有关系,同时和你环境中编译 ...

  6. c语言浮点型与整形比较大小,C语言整形与浮点型转化过程中的精度损失

    本篇文章主要解决的问题是C语言整形与浮点型转化过程中的精度损失从而容易产生bug,对于浮点和整形的相关内容大家可以参考下面两篇文章.,这里就不再赘叙了. 1整形与浮点转化的精度损失参考小程序:1#in ...

  7. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  8. c语言潮流计算验证30节点,C语言潮流计算研究报告.doc

    潮流计算研究报告 潮流计算概述 电力工业是国民经济的基础产业,为保证电力系统安全.稳定及可靠的运行,首先需计算电力系统网络潮流.潮流计算指根据给定的电力系统运行条件及系统接线情况确定整个电力系统各部分 ...

  9. c 语言比较三个整数大小,C 语言 —— 比较三个整数的大小并从大到小输出

    思路一:定义两个比较大小的函数,依次两两比较输出最大或最小的数字(较为繁琐,最易分析) /* C 语言比较三个整数的大小并从大到小输出 思路:定义两个比较大小的函数,依次两两比较输出最大或最小的数字 ...

最新文章

  1. GIS 相关知识扫盲
  2. 通俗易懂!白话朴素贝叶斯
  3. python 为何要学16进制,从十六进制Python中的补
  4. 基于TerraExplorer Pro的校园三维浏览系统开发(转载)
  5. java局部变量简述
  6. python中read函数解释_Python内置函数解释教程,readwill(非常详细的代码演示截图),详解,看,了,就,会,很...
  7. 鏖战九载,Google 是否会因 Oracle 而弃用 Java?
  8. linux中vim中文显示乱码
  9. 01_测试基础知识---功能测试常用方法/正交表的使用
  10. vc6.0处理wps文字
  11. 轻松实现微信、QQ防撤回
  12. 怎么更改计算机用户开机密码,如何更改Windows开机密码?修改电脑开机密码教程...
  13. 【一起学Rust | 设计模式】新类型模式
  14. 搜索引擎优化SEO专业术语总结(新手篇)
  15. 00 Linux到底是什么?
  16. C51单片机的电子时钟(数码管显示)
  17. 微信发定位服务器地址,腾讯位置服务教你轻松搞定微信发送位置功能
  18. pandas 日期比较大小_pandas 对日期类型数据的处理
  19. outlook邮箱链接如何用ie打开_Outlook手机邮箱配置文档
  20. 第一时间安装试用中科红旗桌面操作系统V11

热门文章

  1. 人工智能技术突破以及教育放量未来可期 增持评级
  2. 高光谱数据之多元散射校正
  3. SVN版本控制软件-图片含义详解
  4. 武汉新华电脑学校计算机协会,重庆新华电脑学校计算机管理协会更名庆典
  5. 过来人谈《去360还是留在百度?》(转)
  6. Java 使用 Apache commons-math3 线性拟合、非线性拟合实例(带效果图)
  7. Linux-centOS 安装nginx及常用的nginx命令
  8. 饿了么外卖商家网页IM通信协议
  9. iOS(OC、swift) 结构体和类的区别
  10. python写一个地球同步卫星图动态壁纸(第二部分)