suchen

Heim  >  Fragen und Antworten  >  Hauptteil

如何用C++进行位图RGB读写操作

我想通过C语言打开指定位图的RGB值信息,类似Matlab中imread函数功能.由于无法将像素一一映射成控制台字符按原图显示,我通过重写该图看是否与原图一致验证读位图操作是否成功.结果写出来的位图无法打开.我对比了一下,占用存储空间也比原文件小一点,我猜测是自己对此类型图片的存储结构不了解导致的错误.以下是读写位图操作的代码,请各位指点:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

<code>#include<stdlib.h>

#include<iostream>

#include<windows.h>

//文件路径

#define READPATH "c:\\Users\\asus\\Desktop\\000.bmp"

#define WRITEPATH "c:\\Users\\asus\\Desktop\\0.bmp"

//位图宽和高

#define W 72

#define H 1980

 

using namespace std;

 

int main()

{

    BITMAPFILEHEADER bitFile;

    BITMAPINFOHEADER bitInfo;

    RGBQUAD rgbQuad;

    BYTE b[W][H];

    FILE *fp;

//读文件

    if(!(fp = fopen(READPATH, "r")))

    {

        printf("Error1!");

        exit(0);

    }

//读文件头

    if(!(fread(&bitFile, sizeof(bitFile), 1, fp) && fread(&bitInfo, sizeof(bitInfo), 1, fp) && fread(&rgbQuad, sizeof(rgbQuad), 1, fp)))

    {

        fclose(fp);

        printf("Error2!");

        exit(0);

    }

//读数据

    if(!(fread(&b, sizeof(BYTE), W * H, fp)))

    {

        fclose(fp);

        printf("Error3!");

        exit(0);

    }

    fclose(fp);

//写文件

    if(!(fp = fopen(WRITEPATH, "w+")))

    {

        printf("Error4!");

        exit(0);

    }

    if(!(fwrite(&bitFile, sizeof(bitFile), 1, fp) && fwrite(&bitInfo, sizeof(bitInfo), 1, fp) && fwrite(&rgbQuad, sizeof(rgbQuad), 1, fp)))

    {

        fclose(fp);

        printf("Error5!");

        exit(0);

    }

    if(!(fwrite(&b, sizeof(BYTE), W * H, fp)))

    {

        fclose(fp);

        printf("Error6!");

        exit(0);

    }

    fclose(fp);

    cout<<endl<<"Succeed!"<<endl;

    return 0;

}</code>

//经回答的朋友提醒我补充一下,以上代码是针对我测试用的8位位图的,不具有普适性.

怪我咯怪我咯2903 Tage vor763

Antworte allen(2)Ich werde antworten

  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:24:51

    代码还没仔细看过,先留个坑再说。。。

    先说说一眼看下去的结果,看到一句fwrite(&b, sizeof(BYTE), W * H, fp),题主的bmp是256色的么,如果是24位的应该是W*H*3才对。另外,bmp格式的位图文件中存在align,故数据块的大小不应该通过W*H*(位深度/3),而是通过读取文件头中的信息得到

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-17 14:24:51

    之前用C写过一个
    https://github.com/luckyScrip...
    可以维基百科查一下这个格式的二进制存了哪些东西~

    Antwort
    0
  • StornierenAntwort