我试图在c中实现读取BMP文件。 我从谷歌那里得到了基本的bmp阅读模块,如下所示。
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <io.h>
#include <fcntl.h>
#include "ReadBMP.h"
char ReadBMPFile(const char *file_name, BMPDATA *ret_bmp_data)
{
int fh;
long file_length;
void *bmp_file_data;
fh = _open(file_name, _O_RDONLY, _O_BINARY);
if (fh == -1)
{
return -1;
}
_lseek(fh, 0, SEEK_END);
file_length = _tell(fh);
_lseek(fh, 0, SEEK_SET);
bmp_file_data = malloc(file_length);
_read(fh, bmp_file_data, file_length);
_close(fh);
ReadBMPData(bmp_file_data, ret_bmp_data);
free(bmp_file_data);
return 0;
}
但我觉得很难在我的代码中使用上面的函数。
#include <windows.h>
#include "ReadBMP.h"
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
#define BYTE unsigned char
int main(int argc, char *argv[])
{
FILE *fp;
int i, j, k,n;
int width = 16;
int height = 16;
int bpp = 24;
FILE *fp_new;
char *filename_new;
char ch;
BMPDATA *ret_bmp_data;
int val[1000];
char filename[100];
//char *filename = "test.bmp";
// Check if a filename has been specified in the command
if (argc < 2)
{
printf("Missing Filename\n");
return(1);
}
else
{
filename_new = argv[1];
printf("Filename : %s\n", filename_new);
}
ReadBMPFile(filename_new, ret_bmp_data);
当我这样实施时,我收到了如下错误消息
错误C4700:未初始化的本地变量&#39; ret_bmp_data&#39;使用
如何初始化局部变量?
我已经更新了ReadBMP.c文件。
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <io.h>
#include <fcntl.h>
#include "ReadBMP.h"
void DecodeData(const char *byte_data, int offset, BMPDATA *ret_bmp_data);
void DecodeInfomation(const char *byte_data, int offset, BMPDATA *ret_bmp_data);
char ReadBMPFile(const char *file_name, BMPDATA *ret_bmp_data)
{
int fh;
long file_length;
void *bmp_file_data;
fh = _open(file_name, _O_RDONLY, _O_BINARY);
if (fh == -1)
{
return -1;
}
_lseek(fh, 0, SEEK_END);
file_length = _tell(fh);
_lseek(fh, 0, SEEK_SET);
bmp_file_data = malloc(file_length);
_read(fh, bmp_file_data, file_length);
_close(fh);
ReadBMPData(bmp_file_data, ret_bmp_data);
free(bmp_file_data);
return 0;
}
char ReadBMPData(const void *bmp_file_data, BMPDATA *ret_bmp_data)
{
char *byte_data;
int offset;
byte_data = (char *)bmp_file_data;
if ((byte_data[0] != 'B') || (byte_data[1] != 'M'))
{
return -1;
}
memcpy(&offset, &byte_data[10], 4);
DecodeInfomation(byte_data, offset, ret_bmp_data);
DecodeData(byte_data, offset, ret_bmp_data);
return 0;
}
void DecodeInfomation(const char *byte_data, int offset, BMPDATA *ret_bmp_data)
{
if (offset == 26)
{
memcpy(&ret_bmp_data->width, &byte_data[18], 2);
memcpy(&ret_bmp_data->height, &byte_data[20], 2);
memcpy(&ret_bmp_data->bits_per_pixel, &byte_data[24], 2);
}
else
{
memcpy(&ret_bmp_data->width, &byte_data[18], 4);
memcpy(&ret_bmp_data->height, &byte_data[22], 4);
memcpy(&ret_bmp_data->bits_per_pixel, &byte_data[28], 2);
}
}
void DecodeData(const char *byte_data, int offset, BMPDATA *ret_bmp_data)
{
int data_size;
if (ret_bmp_data->bits_per_pixel == 24)
{
data_size = ret_bmp_data->width * ret_bmp_data->height * 3;
ret_bmp_data->data = malloc(data_size);
memcpy(ret_bmp_data->data, &byte_data[offset], data_size);
}
}
这是ReadBMP.h
#ifndef READBMP_H
#define READBMP_H
typedef struct BMPDATA
{
short bits_per_pixel;
int width;
int height;
unsigned char *data;
}BMPDATA;
#ifdef __cplusplus
extern "C"
{
#endif
char ReadBMPFile(const char *file_name, BMPDATA *ret_bmp_data);
char ReadBMPData(const void *bmp_file_data, BMPDATA *ret_bmp_data);
#ifdef __cplusplus
}
#endif
#endif
和
这是Source.cpp
#include <stdio.h>
#include <stdlib.h> /* system, NULL, EXIT_FAILURE */
#include <windows.h>
#include "ReadBMP.h"
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
#define BYTE unsigned char
int main(int argc, char *argv[])
{
FILE *fp;
int i, j, k,n;
int width = 16;
int height = 16;
int bpp = 24;
////////////////// add BMP read 2018-03-20 ///////////////
FILE *fp_new;
char *filename_new;
char ch;
BMPDATA *ret_bmp_data;
int val[1000];
char filename[100];
//char *filename = "test.bmp";
// Check if a filename has been specified in the command
if (argc < 2)
{
printf("Missing Filename\n");
return(1);
}
else
{
filename_new = argv[1];
printf("Filename : %s\n", filename_new);
}
ReadBMPFile(filename_new, ret_bmp_data);
fclose(fp);
fclose(fp_new);
}
答案 0 :(得分:2)
由于错误消息,似乎BMPDATA
中的main
变量不应该是BMPDATA
指针而是BMPDATA
对象。
像:
int main(int argc, char *argv[])
{
....
BMPDATA ret_bmp_data;
....
ReadBMPFile(filename_new, &ret_bmp_data);
....
}