2013-04-12 185 views
-2

我正在參加一個計算機圖形類,我需要使用紋理,但我不能使用任何庫來完成它。我被困在加載我需要使用的圖像的RGB值(圖像可以是任何格式,JPG,原始,PNG等..)所以我的問題是,這是最簡單的方法來獲得RGB的值沒有使用任何庫來獲取這個值的圖像(任何格式)?以下是我發現已經在網站上:如何獲取圖像的RGB值?

unsigned char *data; 
    File *file; 

    file = fopen("image.png", "r");// 

    data = (unsigned char *)malloc(TH*TV*3); //TH and TV are both 50 

    fread(data, TH*TV*3, 1, file); 
    fclose(file); 

    int i; 

    for(i=0;i<TH*TV*3;i++){ 
     //suposing I have a struct RGB for the rgb values 
     RGB.r = data[?];// how do I get the r value 
     RGB.g = data[?];// how do I get the g value 
     RGB.b = data[?];// how do I get the b value 
    } 

感謝

+1

第一次停止發貨! –

+1

我錯過了打開PNG文件的部分。 PNG格式很複雜,編寫代碼來讀取它完全超出了StackOverflow答案的範圍。不使用圖書館是不切實際的。 –

+1

同樣適用於JPG和許多其他格式。有一些很容易解析(PBM/PGM/PNM,TGA等),但大多數更現代的(尤其是那些專注於壓縮圖像的)不需要庫就可以很容易地閱讀。 – twalberg

回答

0

嘗試使用一些框架樣OpenCV有幾個選項來獲得顏色或操縱圖像。

在這裏,我發現這個示例代碼:

cv::Mat img = cv::imread("lenna.png"); 
for(int i=0; i<img.rows; i++) { 
    for(int j=0; j<img.cols; j++) { 
     // You can now access the pixel value with cv::Vec3b 
     std::cout << img.at<cv::Vec3b>(i,j)[0] << " "; 
     str::cout << img.at<cv::Vec3b>(i,j)[1] << " "; 
     str::cout << img.at<cv::Vec3b>(i,j)[2] << std::endl; 
    } 
} 

但請注意,上面的代碼不是很表現,但上面的代碼應該給你一個想法如何讀取像素。

0

而不是迭代你讀入的每個字節,你想迭代每個由3個字節組成的像素。所以用i+=3代替i++

for(i=0;i<TH*TV*3;i+=3){ 
    RGB.r = data[i]; 
    RGB.g = data[i+1]; 
    RGB.b = data[i+2]; 
} 
+0

一個PNG圖像被壓縮,你應該知道。所以你的代碼無法工作。 – rekire

+0

@rekire,對不起,我錯過了那部分。沒有辦法,你會閱讀一個PNG,而不使用庫。 –

+0

好吧,讓我們用另一種圖像格式,如何處理原始圖像或bmp(我可以使用我想要的格式,我以png爲例) – user2275378

相關問題