读取bmp图片 并生成新的bmp图片

#include "stdafx.h"
#include <windows.h>
#include <cmath>
#include <iostream>

using namespace std;

int main()
{

    long bfSize, bfOffBits;
    long biWidth, biHeight, biBitCount, biSizeImage;

    // 打开待读的位图文件
    FILE *fp = NULL;
    int ret = fopen_s(&fp, "D:\\VC\\BMP\\img1024.bmp", "rb");
    if (fp == 0) {
        cout << "open file failed" << endl;
        return -1;
    }

    // 建立待生成的位图文件
    FILE *wfp = NULL;
    ret = fopen_s(&wfp, "D:\\VC\\BMP\\img_out.bmp", "wb");
    if (wfp == 0) {
        cout << "create output file failed" << endl;
        return -1;
    }

    // 获取BITMAPFILEHEADER
    BITMAPFILEHEADER fileheader = { 0 };
    fread(&fileheader, sizeof(BITMAPFILEHEADER), 1, fp);
    if (fileheader.bfType != 0x4D42) {
        
        cout << "Not BMP Image" << endl;
        return -1;
    }
    else {
        bfSize = fileheader.bfSize;
        bfOffBits = fileheader.bfOffBits;
        fwrite(&fileheader, sizeof(BITMAPFILEHEADER), 1, wfp);  // 写入BITMAPFILEHEADER
    }

    // 获取BITMAPINFOHEADER
    BITMAPINFOHEADER head = { 0 };
    fread(&head, sizeof(BITMAPINFOHEADER), 1, fp);
    biWidth = head.biWidth;
    biHeight = head.biHeight;
    biBitCount = head.biBitCount;
    biSizeImage = head.biSizeImage;

    if (biBitCount != 24) {
        fclose(fp);
        cout << "Not 24bit Bitmap" << endl;
        return -1;
    }
    else {
        fwrite(&head, sizeof(BITMAPINFOHEADER), 1, wfp);  // 写入BITMAPINFOHEADER
    }

    // 输出文件属性信息
    cout << "文件大小 => " << bfSize << "Byte" << endl;
    cout << "数据区偏移量 => " << bfOffBits << "Byte" << endl;
    cout << "宽度 => " << biWidth << "px" << endl;
    cout << "高度 => " << biHeight << "px" << endl;
    cout << "颜色位数 => " << biBitCount << "bit" << endl;
    cout << "数据区大小 => " << biSizeImage << "Byte" << endl;

    // 把位图数据区读入BYTE缓冲区
    BYTE *pBmpBuf = new BYTE[biSizeImage];
    size_t size = 0;
    while (true) {
        int iret = fread(&pBmpBuf[size], 1, 1, fp);
        if (iret == 0) {
            break;
        }
        else {
            size = size + iret;
        }
    }
    fclose(fp);

    int pitch = biWidth % 4; // 每行数据字节数必须是4的倍数
    BYTE ar[1]={0};//不足4的倍数补0
    BYTE vRGB[3];
    for (int i =0; i <biHeight; ++i)
    {
        int realPitch = i*pitch;
        for (int j = 0; j < biWidth; ++j)
        {
            vRGB[0] = pBmpBuf[(i*biWidth + j) * 3 + realPitch];        // BLUE
            vRGB[1] = pBmpBuf[(i*biWidth + j) * 3 + 1 +realPitch];    // GREEN
            vRGB[2] = pBmpBuf[(i*biWidth + j) * 3 + 2 + realPitch];    // RED
            fwrite(vRGB, sizeof(vRGB), 1, wfp);  //把描述一个像素的R、G、B值写入输出缓冲区
        }
        for(int m=0;m<pitch;m++)
        fwrite(ar,sizeof(ar),1,wfp);   //补零
    }

    // 关闭文件缓冲区
    delete[] pBmpBuf;
    pBmpBuf = NULL;

    // 写输出图像
    fclose(wfp);
    cout << endl << "创建输出文件成功" << endl;
    return 0;
}

bmp图片的有关操作的更多相关文章

  1. linu下C语言之BMP图片操作编程(上)

    BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备. 微软已经定义了一个特定的表示颜色 ...

  2. 收集C#常用类:对图片的处理操作

    using System; using System.Collections; using System.IO; using System.Drawing; using System.Drawing. ...

  3. Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片

    在windows的cmd命令行下,使用Python的PIL库打开并显示一个jpg图片: ? 1 2 3 openedImg = Image.open(saveToFile); print " ...

  4. BMP图片转换为JPEG图片

    原文:BMP图片转换为JPEG图片 昨天在家学习,发现很多人把BMP图片转换为其它图片格式,有些人写得简单,有些人写得复杂. Insus.NET在想,一直在做文件上传,下载,或是图片剪切,都有进行过文 ...

  5. bmp图片显示

    文件IO项目: 在开发板屏幕上循环显示目录里的图片 a.按照一定的间隔循环显示目录里的bmp图片 b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张 d1: 1.能操控屏幕(查询开发板 ...

  6. BMP图片格式模型(2)

    因为公司的主要业务是图像识别相关的,因此对图像处理.识别是我学习的重点.虽然写程序也不少年了,但是对于图像处理领域,我还是一个新兵.对很多基础的概念也还是存在盲区,所以想在边学边做的过程中,对一些概念 ...

  7. 简单bmp图片处理工具——python实现

    预备实现功能: 1.读取bmp文件 2.保存bmp文件 3.对bmp图片进行放大.缩小 4.对bmp图片进行灰度化 5.对bmp图片进行旋转 bmp文件格式非常简单,对于我这种初学者来说减少了不少不必 ...

  8. Nginx中防盗链(下载防盗链和图片防盗链)及图片访问地址操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  9. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    版权声明:本文为博主原创文章,转载请注明CSDN博客源地址! 共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/26404733   ...

随机推荐

  1. 14. Longest Common Prefix

    题目: Write a function to find the longest common prefix string amongst an array of strings. Subscribe ...

  2. C#设计模式之抽象工厂

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类. 抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品 当一个工厂等级结构可以创建出分属于不同产品等级结构的 ...

  3. SQL入门语句之SELECT和WHERE

    一.SQL入门语句之SELECT SELECT语句用于从数据库表中获取数据,结果表的形式返回数据.这些结果表也被称为结果集 1.从数据库表中取部分字段 select 字段A,字段B from tabl ...

  4. Note3 :《集体智慧编程》用户相似度计算

    欧几里德距离评价: 以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间的距离远近.计算出每一轴向上的差值,求平方之后再相加,最后对总和取平方根. # -*- codin ...

  5. SVM实现邮件分类

    首先学习一下svm分类的使用. 主要有以下步骤: Loading and Visualizing Dataj Training Linear SVM Implementing Gaussian Ker ...

  6. kettle系列-1.kettle源码获取与运行

    第一次写博客,心里有点小激动,肯定有很多需要改进的地方,望海涵. kettle算是我相对较为深入研究过的开源软件了,也是我最喜欢的开源软件之一,它可以完成工作中很多体力劳动,在ETL数据抽取方面得到了 ...

  7. EM算法总结

    EM算法总结 - The EM Algorithm EM是我一直想深入学习的算法之一,第一次听说是在NLP课中的HMM那一节,为了解决HMM的参数估计问题,使用了EM算法.在之后的MT中的词对齐中也用 ...

  8. Oracle Database 11g Release 2(11.2.0.3.0) RAC On Redhat Linux 5.8 Using Vmware Workstation 9.0

    一,简介 二,配置虚拟机 1,创建虚拟机 (1)添加三块儿网卡:   主节点 二节点 eth0:    公网  192.168.1.20/24   NAT eth0:    公网  192.168.1 ...

  9. winform TreeView的一些用法以及异步加载

    今天,主要弄了一下对于树型控件的一些方法,以及异步加载.参考: http://www.cnblogs.com/greatverve/archive/2012/03/23/winform-treevie ...

  10. SQL基础之基本操作

    1.UNION操作符 union操作符用来合并两个或多个select语句的结果,要注意union内部的每个select语句必须拥有相同数量的列,而且列也必须拥有相似的数据类型和相同的列顺序.下面是我的 ...