2014-12-15 4 views
-1

한 파일에서 비트 맵 이미지를 읽고 다른 파일로 쓰려고하는데 내용이 전송되었는지 확인하려고합니다. 그러나 코드를 실행하면 출력 파일에 이미지가 생성되지 않습니다. 대신 새 파일을 클릭 할 때마다 파일을 열 수 없다고 알려줍니다.비트 맵 이미지를 파일에 쓰는 중

////////////////////////////////////////////////////////////////////// 
// 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

+1

wingdi에서 구조체 정의를 사용하지 않는 이유가 있습니까? 게시하지 않은 것이 아니라면 패킹으로 인해 struct가 동일하지 않을 가능성이 있습니다. 그들은 wingdi에서 1 바이트 패킹을해야합니다. –

+0

교수님은 우리가 코드를 작성하는 데 사용하는 구조체 정의를 주셨습니다. 하지만 wingdi에서 구조체 정의를 확인합니다! –

+1

그래서 패킹이 틀렸고'BITMAPINFOHEADER' 필드의 집합이 빠져 있다는 점 외에도'fread'의 사용법 또한 잘못되었습니다. 처음에는 너무 많이 읽었고, 두 번째는 잘못된 곳으로, 반복 할 때마다 같은 장소를 읽습니다. 그 코드가 충돌하지 않는다고 믿고 그 너비/높이/너비로 값을 인쇄한다고 생각합니다. 심지어는 정확하기도합니다. 내 충고는 파일을 올바르게 읽은 다음 파일 사본을 작성하는 것에 대해 걱정하는 것입니다. –

답변

1

때로는 해결책이 너무보기 쉽습니다.

두 루프 모두에서 동일한 "카운터"를 사용하고 있습니까? 나는 그것이 효과가 없을 것이라고 생각한다.

또한 fread와 fwrite에서는 아마도 같은 장소에서 읽고 쓰고있을 것입니다. 읽을 위치의 포인터를 업데이트해야합니다.

첫 번째 fread에 대한 주석은 "비트 맵 파일 헤더를 읽습니다"라고 말합니다. 나는 그것이 올바르게하고 있는지 확신하지 못합니다.

두 번째 fread를 확인하십시오. 치명적인 문제가있을 수 있습니다. bp으로 읽으시겠습니까? 아마도 변수에 의미있는 이름을 사용하면 도움이 될 것입니다.

BITMAPFILEHEADER 및 BITMAPINFOHEADER 으로 작성해야합니까? 당신이 올바르게하고 있는지 확인하십시오.

이것은 수업 과제이므로 정확한 도움을주지 않는 것이 가장 좋습니다. 나는 이것이 도움이되기를 바랍니다. 내가 바라는 것 이상으로 무엇이라도 있으면 가까이에서 보아서 찾을 수 있기를 바랍니다.

관련 문제