-2

我正在上计算机图形课程,我需要处理纹理,但我不能使用任何库来完成它。我一直在加载我需要使用的图像的 rgb 值(图像可以是任何格式,jpg、raw、png 等)所以我的问题是,这是获取 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
    }

谢谢

4

2 回答 2

0

您不想遍历您读入的每个字节,而是要遍历由 3 个字节组成的每个像素。所以替换i++i+=3.

for(i=0;i<TH*TV*3;i+=3){
   RGB.r = data[i];
   RGB.g = data[i+1];
   RGB.b = data[i+2];
}
于 2013-04-12T17:45:34.333 回答
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;
    }
}

但请注意,上面的代码性能不是很好,但上面的代码应该让您了解如何读取像素。

于 2013-04-12T17:40:25.957 回答