한 파일에서 비트 맵 이미지를 읽고 다른 파일로 쓰려고하는데 내용이 전송되었는지 확인하려고합니다. 그러나 코드를 실행하면 출력 파일에 이미지가 생성되지 않습니다. 대신 새 파일을 클릭 할 때마다 파일을 열 수 없다고 알려줍니다.비트 맵 이미지를 파일에 쓰는 중
//////////////////////////////////////////////////////////////////////
// RGB.h header file for bitmap BMP definitions
// adapted from <WinGDI.h>
///To get DIB header struct. winGDI.h is huge overkill for the needs here
#ifndef RGBH //don't doubly include this stuff, set a flag when first including
#define RGBH
/* structures for defining DIBs //from WinGDI.h */
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef unsigned long int LONG;
typedef unsigned char BYTE;
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef PBITMAPFILEHEADER pbfh;
typedef struct tagBITMAPINFOHEADER {
DWORD biSize; /* used to get to color table */
DWORD biWidth;
DWORD biHeight;
WORD biPlanes;
WORD biBitCount;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef BITMAPINFOHEADER pbih;
typedef struct tagRGBTRIPLE { //from WinGDI.h
BYTE b; //rgbtBlue;
BYTE g; //rgbtGreen;
BYTE r; //rgbtRed;
} pix, *ppix;
#define BYTES_PER_PIX sizeof(pix)
const pix RED = {0,0,255};
const pix GREEN = {0,255,0};
const pix BLUE = {255,0,0};
#endif
////////////////////// End of RGB.h header file ////////////////////////////////
그리고 여기에 내가 작성한 코드입니다 : 여기 내 헤더 파일과 같은 모습입니다 어떤 조언을 크게 감상 할 수
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "RGB.h" //header file for Bitmap
BITMAPFILEHEADER *hp; //var pointer to the header file for bitmap
BITMAPINFOHEADER *p; //var pointer to the info file for bitmap
#define SIZE 100
int main(void)
{
FILE *bp, *op; //var for two file streams
char pix[SIZE]; //var for char name of input file
char out[SIZE]; //var for char name of output file
int n; //var to hold different values through out the program
unsigned char *bitmapImage; //var to store image data
printf("Enter bitmap filename: "); //prompts user to enter filename
scanf("%s", pix); //collects filename from user
//open filename in read binary mode
if((bp = fopen(pix, "rb")) == NULL) if ((bp = fopen(pix, "rb")) == NULL)
{
printf("Can't open file %s", bp); //prints if file path wasn't valid
getchar();
exit (1);
}
//malloc memory for file header
hp = (tagBITMAPFILEHEADER*)malloc(sizeof(tagBITMAPFILEHEADER));
//reads the bitmap file header
n = fread(pix, 1,SIZE, bp);
//read bitmap info header
fread(bp, sizeof(tagBITMAPINFOHEADER), 1, bp);
//allocate enough memory for the bitmap image data
p = (tagBITMAPINFOHEADER*) (pix+14);
bitmapImage = (unsigned char*) malloc(p->biSize);
//verify memory allocation
if (!bitmapImage)
{
free(bitmapImage);
fclose(bp);
puts("Memory allocation not allowed");
return NULL;
}
puts("Input File Statistics: \n");
printf("File size: %ld bytes", p->biSize); //prints out total file size
printf("\nWidth x Height = %ld x %ld", p->biWidth, p->biHeight); //prints out dimensions of image
printf("\nBits/pixel = %u\n", p->biBitCount);
printf("\nEnter an output filename for bitmap: "); //prompts user for output file name
scanf("%s", out); //collects pathway from user
//open output file
if((op = fopen(out, "wb")) == NULL)
{
puts("Invalid file");
fclose(op);
exit (2);
}
fclose(op);
return 0;
}
! 감사! O. Helm
wingdi에서 구조체 정의를 사용하지 않는 이유가 있습니까? 게시하지 않은 것이 아니라면 패킹으로 인해 struct가 동일하지 않을 가능성이 있습니다. 그들은 wingdi에서 1 바이트 패킹을해야합니다. –
교수님은 우리가 코드를 작성하는 데 사용하는 구조체 정의를 주셨습니다. 하지만 wingdi에서 구조체 정의를 확인합니다! –
그래서 패킹이 틀렸고'BITMAPINFOHEADER' 필드의 집합이 빠져 있다는 점 외에도'fread'의 사용법 또한 잘못되었습니다. 처음에는 너무 많이 읽었고, 두 번째는 잘못된 곳으로, 반복 할 때마다 같은 장소를 읽습니다. 그 코드가 충돌하지 않는다고 믿고 그 너비/높이/너비로 값을 인쇄한다고 생각합니다. 심지어는 정확하기도합니다. 내 충고는 파일을 올바르게 읽은 다음 파일 사본을 작성하는 것에 대해 걱정하는 것입니다. –