我正在学习计算机图形课程,我需要使用纹理,但我不能使用任何库来完成它。我坚持加载我需要使用的图像的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
}
由于
答案 0 :(得分: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;
}
}
但请注意,上面的代码性能不是很好,但上面的代码可以让您了解如何读取像素。
答案 1 :(得分: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];
}