![](/img/trans.png)
[英]How to convert unsigned char* to an unsigned char array in C/C++?
[英]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.