簡體   English   中英

c ++-將float數組轉換為unsigned char數組並寫入文件

[英]c++ - Convert an array of float to an array of unsigned char and write to file

我正在寫一個PPM文件編寫器。 文件格式說明可在此處找到。 我想以二進制格式( P6類型)寫入文件。

同一張圖片的P6二進制格式表示每個像素的每個顏色分量,其中一個字節(因此每個像素三個字節)按紅色,綠色,藍色的順序排列。 該文件較小,但是人很難讀取顏色信息。

我的圖像緩沖區最初是一個Vec3f數組,它位於float[3]內部,因此我可以設法將Vec3f數組轉換為float數組。

我沒有做的就是將float數組轉換為unsigned char數組,以便可以寫入.ppm文件。

這是我的代碼:

void writePPM(char *fn, Vec3f *buffer, int w, int h) {
        FILE *fp = fopen(fn, "wb");
        unsigned char *char_buffer = new unsigned char[w*h*3];
        for (int i = 0; i < w*h; i+=3) {
            char_buffer[i] = (unsigned char)buffer[i].x();
            char_buffer[i+1] = (unsigned char)buffer[i].y();
            char_buffer[i+2] = (unsigned char)buffer[i].z();
        }
        fprintf(fp, "P6\n%d %d\n\255\n", w, h);
        fwrite(char_buffer, sizeof(unsigned char), w*h*3, fp);
        fclose(fp);
    }

buffer [i] .x(),buffer [i] .y(),buffer [i] .z()的范圍是[0,255]

生成的圖像是一個全黑的圖像,但是寬度和高度與我的圖像緩沖區匹配,所以我認為fwrite部分是錯誤的。 我該如何解決?

我也很困惑如何將float轉換為char char是8位, float較大,所以一定會有數據丟失嗎?

緩沖區索引檢查。

for (int i = 0; i < w*h; i+=3) {
    char_buffer[i] = (unsigned char)buffer[i/3].x();
    char_buffer[i+1] = (unsigned char)buffer[i/3].y();
    char_buffer[i+2] = (unsigned char)buffer[i/3].z();
}

這有點猜測,但我希望指定為三個浮點數的像素將使每個浮點數都在[0,1]范圍內,其中0為黑色,而1為白色。 而我希望您的基於char的像素會希望每個元素都在[0,255]范圍內,其中0為黑色,255為白色。

(char) someFloat轉換(char) someFloat通過截斷小數部分將float轉換為char ,因此所有像素最終都會變成黑色-或幾乎是黑色。

嘗試在強制轉換之前將浮點數乘以255(並確保char是無符號的),即(unsigned char)(float * 255)

暫無
暫無

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

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