有沒有辦法在 C 中使用 FILE fopen 讀取影像像素或考慮影像的任何資料?我對圖書館不感興趣。我試圖用 fgetc 讀取影像資料,但它列印出一些沒有任何意義的數字。
編輯:我知道它應該列印出數字,但我期待代表每個像素的數字。
編輯:我正在尋找可以幫助我理解 jpeg 或 png 格式如何作業和存盤資料的檔案鏈接。
uj5u.com熱心網友回復:
如果您真的希望能夠讀取和寫入影像,只需通過 FILE 指標,您將需要查看稱為 .ppm 的檔案格式。(便攜式像素圖。)當然,這假設您可以將影像檔案轉換為 .ppm,但這可以使用 imagemagick 命令列工具輕松實作。您可以使用 imagemagick 將您寫入的 .ppms 轉換為您喜歡的任何輸出型別。
格式非常簡單:
- 以兩個字符(“幻數”)“P6”開頭
- P6 后跟一個空格,然后是影像的寬度(以 ascii 表示)。
- 寬度后跟一個空格,然后是影像的高度(以 ascii 表示)。
- 標題的最后一位是條目的“最大值”。只需使用 255。在此后面加上一個空格。
- 之后,您只需以二進制形式寫入 RGB 值。每個通道一個無符號字符。
例子:
P6 128 128 255
[128 * 128 * 3 bytes of data go here, in row major order. The top-left
pixel is first, then the pixel to the right of it. When you get to the
end of a row, just write the first pixel of the next row. That's all
there is. No other header info, no terminators, etc.]
例子:
#include <stdio.h>
void main() {
FILE * out;
out = fopen("color_test.ppm", "wb");
fprintf(out, "P6 256 256 255\n");
for(int r=0; r<256; r ) {
for(int b=0; b<256; b ) {
fputc(r, out);
fputc(0, out);
fputc(b, out);
}
}
fclose(out);
}
這會產生:

讀取檔案同樣容易。您可以將它們拉入一個 3d 無符號字符陣列,根據需要在記憶體中操作它們,然后將該資料寫回另一個檔案,就像我的示例在此處所做的那樣。
uj5u.com熱心網友回復:
我不太明白你想做什么,但C語言是一種低級編程語言。當然,記憶體中只有數字。
在 C 中存盤影像的最簡單方法是創建矩陣結構并保留 RGB 值。你提到的數字可以是每個像素的RGB值。
uj5u.com熱心網友回復:
您可以在不使用庫的情況下讀取影像,但這需要大量作業。
例如,libjpeg-turbo 可能是最流行的讀取 JPEG 影像的庫:
https://github.com/libjpeg-turbo/libjpeg-turbo
大約有 50,000 行 C 和匯編。
有趣的是,它包括讀取和寫入一些其他格式的函式(命令列 JPEG 工具使用這些例程進行檔案格式轉換)。例如,下面是 libjpeg-turbo 用于加載 BMP 影像的代碼:
https://github.com/libjpeg-turbo/libjpeg-turbo/blob/main/rdbmp.c
大約 700 行,但它只能讀取 BMP 的一個子集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/317164.html
上一篇:合并圖元串列和整數串列
下一篇:懸停時隱藏影像-SCSS
