簡體   English   中英

使用C讀取PPM文件的像素數據

[英]Reading pixel data of a PPM file using C

我正在嘗試從PPM文件讀取像素數據。 我有一個讀取標頭的函數,所以我知道它指向像素數據的開頭。 我嘗試使用fgetc(file),但是如果該值超過一位,它將無法正常工作。 我也嘗試使用數組並將數組轉換為int或char,但是我無法知道每個值有多少位數。 我也不確定這些值是否用空格分隔。 基本上,我需要一種提取像素數據的方法。 (我正在使用C。)

我現在的代碼是:

char read_byte(FILE *ipt) {
    int c, i=0, sum=0;
    while (i<16) {
        c=fgetc(ipt);
        if((i%2)!=0 {
            if(c&1) {
                sum+=pow(2,i/2);
            }
        }
        i++;
    }
    return (char)sum;
}

編輯:起初我以為文件存儲為ASCII值,然后我意識到它存儲為二進制。 現在,我想我正在使它像六角形。 我不確定這是否正確。 我真的被卡住了。

編輯:稍微改變了我的代碼

char read_byte(FILE *ipt) {
    int c, i=0, sum=0;
    while(i<8) {
        c = fgetc(ipt);
        c=c&1;
        sum+=c*pow(2,i);
        i++;
    }
    return sum;
}

我將總和打印為%c

您是否必須為此編寫作業,還是為了娛樂,還是可以使用他人的代碼?

有一個開源解決方案。 “ Netpbm是圖形程序和程序庫的軟件包。”其中包含用於讀取PPM的程序,網址為http://netpbm.sourceforge.net/doc/

編輯:您是否已經獲得或閱讀了文件格式的定義,例如http://netpbm.sourceforge.net/doc/ppm.html

看起來數據是一個1字節RGB三元組的序列,還是兩個字節RGB三元組的序列。

程序可以從項目7“最大顏色值(Maxval)”中檢測使用哪種格式。 它說:“如果Maxval小於256,則為1個字節。否則為2個字節。”

因此,您編寫了一個函數,該函數讀取一個字節/分量的RGB數據,然后編寫另一個函數以讀取兩個字節/分量的RGB數據。

一旦程序讀取了Maxval的值,就可以選擇調用哪個。

編輯{

根據該鏈接上的文檔,“ P6” ppm中的圖像數據是二進制的。

因此,如果MaxValue <256,因此每個顏色分量的數據為一個字節,則使用fgetc(fp)的三個調用讀取三個字節將返回一個RGB像素的二進制值。

如果程序已讀取標題,則它具有圖像數據的width和height值。 因此,它可以為每行分配一個數組(寬度為RGB像素),並為每個分配的像素行數組分配一個指針數組。 然后將二進制數據讀入每一行,程序就可以直接進行操作。 一個二維數組

結束編輯

我對您的問題的閱讀表明,您已經知道如何使用fgetc讀取一個字節的數據。

編輯-似乎無關緊要:您可以通過調用fgetc兩次,然后對數據進行移位和位或運算來讀取兩個字節的數據,例如(部分忽略錯誤檢查):

int a = fgetc(fp);
int b = fgetc(fp);
if (a >= 0 && b >= 0) { // then all is okay
    unsigned int twobyte = (a<<8) | b; // or (b<<8) | a; depending on byte order
// ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM