2017-12-16 2 views
1

비트 맵 파일을 수정하려고하는데이 작업을 수행하려면 크기가 필요합니다.비트 맵 파일의 크기가 맞습니까? 일치하지 않는 속성

내가 제대로 헤더를 읽어, 나는 (C 사용, BTW)이 구조체를 사용 확신 : 나는 버그 결과를 얻고 하루의 끝에서

#pragma pack(1) 

struct bmp_fileheader 
{ 
    unsigned char fileMarker1; /* 'B' */ 
    unsigned char fileMarker2; /* 'M' */ 
    unsigned int bfSize; /* File's size */ 
    unsigned short unused1; 
    unsigned short unused2; 
    unsigned int imageDataOffset; /* Offset to the start of image data */ 
}; 

struct bmp_infoheader 
{ 
    unsigned int biSize; /* Size of the info header - 40 bytes */ 
    signed int  width; /* Width of the image */ 
    signed int  height; /* Height of the image */ 
    unsigned short planes; 
    unsigned short bitPix; 
    unsigned int biCompression; 
    unsigned int biSizeImage; /* Size of the image data */ 
    int   biXPelsPerMeter; 
    int   biYPelsPerMeter; 
    unsigned int biClrUsed; 
    unsigned int biClrImportant; 
}; 

#pragma pack() 

을, 그리고 그것이 때문에 생각 bfSize가 파일의 특성과 일치하지 않습니다. (오른쪽의 printf bfSize에서 속성을 다릅니다 클릭합니다. 나는이 링크 (https://en.wikipedia.org/wiki/BMP_file_format#Example_1)에서 이해하는 것과

을의 bfSize 전체 크기를 포함해야합니다, 패딩을 포함. bfSize이 속성과 다른 경우

그것은 괜찮습니까?

난 그냥 생각이있어

, 픽셀 '배열?

을 시작할 위치를 내가 읽어 것처럼 파일에서 계속 읽기, 당신은 내가 프라 그마 팩을 사용하여 구조체를 읽을 수 있기 때문에 내 버그 결과라고 생각합니까

나는

과 같은 것을 사용하고 있습니다.
FILE *pf 

나는이 구조체를 읽었습니다.

픽셀 배열에 저장된 옥텟 수를 계산합니다.

그런 다음 필자는 pf의 위치에서 계속되는 8 진수를 읽었고, 이는 필자의 논리에 따라 정확히 배열이 시작되는 위치에 있어야한다.

읽어 주셔서 감사합니다.

편집 : ps : 이러한 차이점은 다음과 같습니다. bfSize는 3645라고 표시되며 속성에 3702가 표시됩니다. 이는 상당히 큰 차이입니다. bfSize 번호는 속성 번호보다 항상 작습니다.

+0

'bfSize'가 Disk_ bytes의 _Size보다 작 으면 'bfSize'가 잘못됩니다. MSDN에서 :'bfSize' _ 비트 맵 file_의 크기를 바이트 단위로 지정합니다. –

+0

파일을 "" "rb"'모드로여시겠습니까? –

+0

"rb"모드로 엽니 다. 동일한 FILE * pf를 사용하여이 두 구조체를 읽습니다. 그런 다음 각 바이트를 읽습니다. – NuSuntStudent

답변

1

bfSize은 헤더를 포함하여 파일의 크기입니다.

biSizeImage은 바이트 단위의 픽셀 데이터 크기입니다. 데이터는 imageDataOffset (더 일반적으로는 bfOffBits)에서 시작합니다.

#pragma pack(1)으로 헤더를 정의하는 것이 정확합니다. 그것들을 정의한 후에는 패킹을 복원해야하지만 읽으려면 중요하지 않습니다.

이미지의 크기를 변경하려면 새 높이를 새 주사선 크기와 곱해야합니다. 주사선을 사용하여 가장 가까운 단어로 반올림됩니다 : 파일에서 비트 맵 정보 헤더 구조체 읽기 bih

int scanlineSize= WIDTHBYTES(bih.biWidth * bih.biBitCount); 

: 당신이 좋아하는 전화

// WIDTHBYTES takes # of bits in a scanline and rounds up to nearest word. 
#define WIDTHBYTES(bits) (((bits) + 31)/32 * 4) 

.

비트 맵을 읽는 방법은 pointer file randomly changes value in middle of reading raw bitmap data을 참조하십시오.

+1

파일의 크기를 변경하고 싶지 않습니다. 이봐, 나는 숫자와 흰 바탕으로 그림을 얻고있다. 숫자는 다른 색상을 가지며 임의로 배치됩니다. 내 목표는 숫자 색상을 지정된 색상으로 변경하는 것입니다. 그리고 이것을 모든 숫자에 적용한 다음 새 bmp 파일을 생성하십시오. 내 문제는, 지금까지, 내 ​​bfSize 올바르지 않은 것 같습니다, 나는 이유를 알아낼 수 없습니다. – NuSuntStudent

관련 문제