2017-10-01 4 views
1

bmp 파일을 뒤집어 씌우려 고합니다. 올바른 출력을 얻는 데 너무 가깝지만 어디서 잘못되었는지 잘 모릅니다.BMP 그림 반전 결과가 엉망입니다.

는 [내 출력이 [1]로 반전 이미지

원래는 중간에 검은 상자 X 흰색 배경이었다. 그러나 오른쪽 상단에는 검은 선이 없었습니다 (제 출력물은 오른쪽 상단 근처에 흰색 선이 있습니다). 모든 설명을 이해할 수 있습니다. 픽셀

int index = 0; 
while (index < dibHeader.width) { 
    int index2 = 0; 
    while (index2< dibHeader.length) { 

     fread(&pixel.b, 1, 1, file); 
     unsigned int blue = pixel.b; 
     blue = ~blue; 
     pixel.b = (char) blue; 

     ... Same for green/red 

     fseek(file, -3, SEEK_CUR); 
     f(write(&pixel.b, 1, 1, file); 

     ... Same for green/red 

     index2++; 
    } 
    index++; 
} 

구조체 : 반전하지

루프 픽셀의

struct Pixels { 
    unsigned char b, g, r; 
} 

선언을

struct Pixels pixel; 
+0

'픽셀'을 선언하는 코드와 '픽셀'을 진행하는 코드를 포함 할 수 있습니까? – Reg

+3

각 행을 4 바이트의 배수로 만들기 위해 필요한 패딩을 어떻게 처리합니까? –

+0

모든 픽셀을 읽고 탐색하지 마십시오. 전체 내용을 읽고 처리하고 전체적으로 다시 작성하십시오. 그것은 훨씬 더 효율적 일 것입니다. – rustyx

답변

1

게시 한 이미지의 너비는 273 픽셀입니다. 귀하의 코드가 24 비트 이미지를 처리하고있는 것 같습니다. 24 비트 이미지의 폭은 열에 의해 행함으로써 비트 맵이 상하로 행으로부터 판독되는 4

int padding = dibHeader.width % 4; 

여러 다음 열인 확인 채워 져야한다. 이 경우 위에서 아래로 갈지는 중요하지 않지만 먼저 행을 반복하고 각 열을 채우고 각 행마다 패딩을 적용해야합니다.

//24-bit image: 
int padding = dibHeader.width % 4; 
index = 0; 
while(index < dibHeader.height) //<== go through the height 
{ 
    index2 = 0; 
    while(index2 < dibHeader.width) 
    { 
     fread... 
     pixel.r = ~pixel.r; 
     pixel.b = ~pixel.b; 
     pixel.g = ~pixel.g; 

     fseek(f, -3, SEEK_CUR); 
     fwrite... 
     fflush(f); 
     index2++; 
    } 
    fseek(f, padding, SEEK_CUR); //<== skip padding 
    index++; 
} 
1

여기에 의심 적어도 두 가지가 있습니다

먼저 pixel.b = (char) blue을 사용하여 부호없는 정수를 char에 캐스팅 한 다음 unsigned char에 할당합니다. 간단히 pixel.b = blue으로 작성하십시오.

두 번째로, 읽기와 쓰기간에 전환 할 때마다 파일 위치 색인을 이동하지 않아도 fseek (또는 fflush)을 호출해야합니다. 그렇지 않으면 동작이 정의되지 않습니다. 그래서 당신은 당신의 쓰기 후 fseek을 소개 할 것이다 : 당신의 프로그램이 바이너리 모드로 파일을 열 필요

index2++; 
fseek(file, 0, SEEK_CUR); 

주, 즉 "rb+".

0

나는 당신이 다시 필요가 있다고 생각이에

unsigned int blue = pixel.b; 
blue = ~blue; 
pixel.b = (char) blue; 

:

pixel.b ~= pixel.b; 

및 데이터에 사용할 버퍼입니다. 몇 바이트를 읽고 쓸 필요가 없습니다. 버퍼에있는 모든 데이터를 읽고 버퍼와 함께 작업 한 다음 데이터를 파일에 쓸 수 없습니다. 또한 파일에 데이터를 쓰고 난 후 삽입을 잊어 버린 것을 볼 수 있습니다. fseek(file, -3, SEEK_CUR);. 그러나 어떤 방법 으로든, 버퍼로 더 강력하고 완벽하게 작업 할 수 있습니다.