Bitmap 图片格式并用 C++ 读写 Bitmap

news/2025/2/25 3:22:29

转自 Bitmap 图片格式并用 C++ 读写 Bitmap

1、Bitmap 图片格式

 

  每部分的具体内容就不展开了。要说的有两点:

  (1)调色板不是必须的,可有可无,有没有调色板可以通过位图文件头的 bfOffBits 是否等于位图文件头加上位图信息头的长度来判断。调色板这个问题也曾经导致我在用 C++ 读取 BMP 的时候出错,原因就是并不是每个图片都没有调色板的,我读取的开始位置错了。

  (2)windows 的 BMP 是从最后一行开始读的!这个问题曾经导致我在用 C++ 做图像的旋转时方向错误。

2、C++ 读取 Bitmap 图片

 

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <windows.h>  
      
    typedef struct  
    {  
        BYTE b;  
        BYTE g;  
        BYTE r;  
    }RGB;  
      
    void imgOpr(RGB &a,RGB &b)  
    {  
        b.b=a.b;      
        b.g=a.g;  
        b.r=a.r;  
    }  
      
    int main()  
    {  
        BITMAPFILEHEADER fileHeader;  
        BITMAPINFOHEADER infoHeader;  
        FILE* pfin =fopen("D:/1.bmp","rb");  
        FILE* pfout = fopen( "D:/2.bmp" , "wb");  
        //Read the Bitmap file header;  
        fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);  
        //Read the Bitmap info header;  
        fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);  
        //为简化代码,只处理24位彩色  
        int height,weight;  
        height=0;  
        weight=0;  
        height=infoHeader.biHeight;  
        weight=infoHeader.biWidth;  
        if( infoHeader.biBitCount >= 1)  
        {  
            int size = height * weight;  
            RGB img[height][weight];  
            RGB img2[weight][height];  
            fread( img , sizeof(RGB) , size , pfin );  
              
            //对图片进行操作   
            int i, j;  
            for (i=0; i<height; i++)   
                for (j=0 ; j < weight ; j++ )  
                {  
                    //将数组 img 赋值给 img2   
                    imgOpr(img[i][j],img2[i][j]);  
                }  
              
            //将修改后的图片保存到文件   
            fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout );  
            fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout );  
            fwrite( img2 , sizeof(RGB) , size , pfout );  
        }  
        fclose(pfin);  
        fclose(pfout);  
      
        return 0;  
    }  

 


http://www.niftyadmin.cn/n/4582759.html

相关文章

Android Studio多渠道打包和代码混淆教程 【亲测可用】

from : http://www.tuicool.com/articles/mQZNvey 时间 2015-11-18 10:13:14 极客头条原文 http://coolshell.info/blog/2015/03/android-studio-prefrence.html主题 Gradle Android Studio什么是Gradle Gradle是一种依赖管理工具&#xff0c;基于Groovy语言&#xff0c;面向J…

UIView和Masonry实现动画效果

Masonry 实现动画效果如下&#xff1a; //button点击方法 - (void)clickedButton {static BOOL isMove; //默认是NOWeakify(weakSelf);//告诉self.view约束需要更新[weakSelf.view setNeedsUpdateConstraints];//调用此方法告诉self.view检测是否需要更新约束&#xff0c;若需要…

android 底层日志 开发框架 崩溃后进行记录 LogReport

类别&#xff1a; 其他 (Others)打分&#xff1a; ★★★★★更新&#xff1a; 2016-07-24 22:05大小&#xff1a; 902 kb开发环境&#xff1a; Android Studio浏览&#xff1a; 205 次下载&#xff1a; 10 次项目地址&#xff1a; https://github.com/wenmingvs/LogReport 介绍…

Layui基本功能(增删改查)

话不多说&#xff0c;根据我前面的博客我们直接进行操作。记住以下的文件放置&#xff0c;防止操作出不来. 这是我们要完成的界面及功能 后台功能实现 数据查看 我们在userDao方法里面进行增删改查的方法我们在userAction进行方法的编写R工具类的介绍 查询 userDao方法 因为我…

CentOS6.8 x86_64bit shell脚本实现模拟nginx服务启动与关闭

shell脚本模拟nginx服务启动与关闭注意&#xff1a; 3个斜杠///后面表示在这表示对当前语句的解释&#xff0c;实际脚本中必须删除 #!/bin/bash///定义哪种脚本语言解释下面的语句[ -f /etc/init.d/functions ]&& . /etc/init.d/functions ///判断并加载系统函数nginx&…

线程安全和线程不安全的区别

线程安全 就是多线程访问时&#xff0c;采用了加锁机制&#xff0c;当一个线程访问该类的某个数据时&#xff0c;进行保护&#xff0c;其他线程不能进行访问直到该线程读取完&#xff0c;其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全 就是不提供数据访问保护…

10分钟上线 - 利用函数计算构建微信小程序的Server端

摘要&#xff1a; 阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算&#xff0c;您无需管理服务器等基础设施&#xff0c;只需编写代码并上传。微信小程序是一种不需要下载安装即可使用的应用&#xff0c;它可以在微信内被便捷地获取和传播。 当微信小程序遇见serv…

安卓 eclipse 项目 迁移 android studio gradle 配置 热修复 annotations注解

repositories {mavenCentral()mavenLocal()jcenter() }buildscript {repositories {mavenCentral()mavenLocal()jcenter()}dependencies {classpath com.android.tools.build:gradle:2.1.0// annotations 注解classpath com.neenbedankt.gradle.plugins:android-apt:1.4// tin…