2016-04-11 35 views
0

Herkese iyi günler. Öncelikle, kodum için özür dilerim - Ben C de gerçek bir acemi değilim. Benim sorunum - ppm dosyası verilmiş ve oradan bir dizi içine değerleri depolamak gerekir. Zaten yükseklik, genişlik ve maksimum renk değerini kaydettim, şimdi bir değer saklamak benim fikrim, resimdeki gibi olacaktır - üç ile çarpmak, çünkü R G B formatındadır. Yardımlarınız için teşekkür ederim ve ben C. gerçek acemi değilim gerçeğini consider lütfenppm dosyasından gelen görüntü evrişimi

my code and output

#include <stdio.h> 
int main(int argc, char** argv) { 
int i = 0; 
int j = 0; 
FILE *fp; 
fp = fopen(argv[1], "r"); 
printf(" %s ", argv[1]); 
printf("\n"); 
int firstLine[2]; 
int width; 
int next; 
int enter; 
int loop; 
int height; 
int max_color; 
int pix[width][height]; 
int mask[3][3] = {// inicializting our given mask 
    {0, -1, 0}, 
    {-1, 5, -1}, 
    {0, -1, 0} 
}; 

for (i = 0; i < 3; i++) { 
    for (j = 0; j < 3; j++) { 
     printf("%d ", mask[i][j]); 

    } 
    printf("\n"); 
} 

fscanf(fp, "%s", &firstLine); 
fscanf(fp, "%d", &height); 
fscanf(fp, "%d", &width); 
fscanf(fp, "%d", &max_color); 


printf("%p", firstLine); 
printf("\n"); 
printf("%d ", width); 
printf("\n"); 
printf("%d", height); 
printf("\n"); 
printf("%d", max_color); 
printf("\n"); 


for (i = 0; i < width * 3; i++) { 
    for (j = 0; j < height * 3; j++) { 
     loop = fscanf(fp, "%d", &enter); 
     pix[i][j] = enter; 
     printf("%d ", enter); 
    } 
} 

// fclose(fp); 


return (EXIT_SUCCESS); 

}

+0

Lütfen kodu paylaşmak için resimler kullanmayın! :) lütfen kopyalayıp buraya yapıştırın veya bir macun yapın. – fluter

+0

Üzgünüm, burada yeni başlayan biriyim, bu yüzden şimdi yaptım. Teşekkürler – user118331

+0

8-bit R, G ve B örneklerini almanız söylendi, ancak teknik olarak bunu varsaymadan önce 'MAX_INTENSITY' 255 olup olmadığını kontrol etmelisiniz, ve eğer 255'in üzerindeyse (büyük olasılıkla 65535'e eşittir), 16 bitlik örnekler okumalısınız. –

cevap

1

değildir Bilinmeyenle boyutu, başkasıyla yükseklik ve genişliğe sahip dizi tanımlayamazsınız başlatıldı. Bunu, burada dinamik tahsis dizi kullanmalısınız:

int ***pix; 
pix = malloc(height * sizeof(int**)); 
for (i = 0; i < height; i++) { 
    pix[i] = malloc(width * sizeof(int**)); 
    for (j = 0; j < width; j++) { 
     pix[i][j] = malloc(3 * sizeof(int)); 
    } 
} 

düzeltmek için ikili ayrıştırmak, onlar dizeleri çünkü sen biçimli girdi kullanamazsınız. Bunun yerine, örn. genişliğini okumak için:

fread(&width, sizeof(int), 1, fp); 

O zaman bu diziyi doldurmak için:

for (i = 0; i < height; i++) { 
    for (j = 0; j < width; j++) { 
     for (k = 0; k < 3; k++) { 
      fread(&enter, sizeof(int), 1, fp); 
      pix[i][j][k] = enter; 
     } 
    } 
} 

Bu, yalnızca size ppm dosyanın biçimi hakkında söylediklerini elbette doğru ise.

+0

Merhaba, cevabınız için çok teşekkürler, bunu takdir ediyorum. Maalesef bu işe yaramaz - dizideki tüm bloklar için 21755842 veriyorum. Biz ikili kodlanmış formatı taşınabilir pixmap formatında bir giriş ppm dosyası verildi. Bu tür bir format her zaman vardır: P6, genişlik, yükseklik ve daha sonra sabit - piksel yoğunluğunun maksimum değeri ve ardından veriler - her piksel için RGB parçaları. Piksel/RGB'nin her bir parçası bir Bayttır. – user118331

+0

Dosya ikilidir, bu yüzden formatlanmış giriş kesinlikle çalışmaz! – fluter

+0

@fluter Başlık aslında ASCII'de, sonra veriler ikili olarak izlenir. –

İlgili konular