2017-02-22 12 views
0

각 행이 픽셀에 해당하고 각 열이 PPM P3 이미지의 R G B 값인 행렬을 원합니다.PPM (P3) 이미지의 픽셀 데이터를 C의 매트릭스로 어떻게 읽습니까?

[imageWidth * imageHeight] [3]을 크기로 사용하여 매트릭스를 만들려고했지만 크기가 채워 지지만 영원히 남아있는 것으로 보입니다. 내가 뭔가를 놓친 것 같아요, 아무도 내가 잘못했는지 설명하거나 더 나은 방법을 제안 할 수 있습니까?

int pixels [imageSize] [3]; 

while(fgets(line,70,fd) != NULL){ 
    for (column = 0; column < (imageSize); column++){ 
    for (row = 0; row < 1; row++){ 
     sscanf(line, "%d %d %d", &r, &g, &b); 
     pixels [column] [row] = r; 
     pixels [column] [row + 1] = g; 
     pixels [column] [row + 2] = b; 
    } 
    } 
} 

라인은 fgets 기능으로 읽은 라인을 참조합니다.

+0

당신을 결코 :

처음 래스터의 첫 번째 행의 첫 번째 문자에 위치하는 FILE와 함께, 당신은 fd에 의해 지정된 FILE에서 imageSize 픽셀을 읽을 수 있음을 감안할 때,이 트릭을 할 것입니다 'line'을 갱신하면, 같은 값을 반복해서 스캔 할 수 있습니다. – jwodder

+0

와우, 나는 업데이트 라인을 수행하는 내 outer while 루프를 놓쳤습니다. –

+0

이미지의 다른 * 행 *에 r, g, b 구성 요소를 넣는 것은 신비한 일입니다. 또한 왜'for (column = 0; column <(imageSize); column ++)'루프를 읽었을 때마다 느려지는 이유. 저는 종이에 비공식 의사 코드 (pseudo code)가 있더라도 당신이 원하는 것을 정확히 보여주는 흐름 차트를 작성하는 것이 좋습니다. –

답변

1

수정 된 코드에서 문제가 명확합니다. 이미지의 모든 픽셀을 래스터 라인에서 읽으려고합니다. fgets()이 무기한 차단되지 않는 한 은 영원히으로 실행되지 않지만 래스터 크기가 크고 파일이 여러 줄의 픽셀로 구성된 경우 매우 오랜 시간이 걸릴 수 있습니다. 어쨌든 입니다. 가장 바깥 쪽 루프의 반복마다 - 즉, 읽은 각 행에 대해 이전에 할당 된 모든 픽셀 값을 덮어 씁니다.

또한 가장 안쪽의 루프는 실제로 잘못은 아니지만 매우 난해합니다. 항상 정확히 하나의 반복 만 수행합니다. 그것의 반복 변수 row 실제로 픽셀 구성 요소 (래스터 행 반대) 인덱스 및 row 어쨌든 모든 반복마다 0 값이 있습니다. 그냥 제거하는 것이 좋습니다.

전반적으로 이것이 필요한 것보다 훨씬 더 어려워지고 있습니다. PPM P3 형식은 훨씬 간단한 코드를 통해 입력 할 수있는 방식으로 설계되었습니다. 유효한 PPM P3 파일의 각 샘플에는 공백이 있어야합니다. 반면에 필드의 위치와 너비 및 줄 수는 고정되어 있지 않습니다. 함께 이러한 특성은 fscanf()이 실제로는 fgets() + sscanf()보다 나은 선택 인 비교적 드문 경우입니다. 줄 길이 제한은 후자를 너무 좋게 만들지 만 추가로 발생하는 복잡성은 필요하지 않습니다.

for (pixel = 0; pixel < imageSize; pixel++) { 
    int numScanned = fscanf(fd, "%d %d %d", 
      &pixels[pixel][0], 
      &pixels[pixel][1], 
      &pixels[pixel][2]); 
    if (numScanned < 3) { 
     // ... handle file format or I/O error ... 
     break; 
    } 
}