gpt4 book ai didi

c++ - 从ppm文件读取RGB值,并使用结构将其存储到称为 “Image”的2d数组中(动态数组)

转载 作者:行者123 更新时间:2023-12-02 10:35:19 25 4
gpt4 key购买 nike

我正在尝试从ppm文件读取并提取RGB值,并将其存储到带有C++的2d数组中。我很确定解决方案非常简单,但是对于我自己的一生,我看不到它。我所有的尝试都会产生大量错误。

编辑:数组中的值必须按列优先。显然我需要将数字存储在结构中,并将这些数字存储到数组中。

背景知识:

第一个参数是要打开和读取的文件的名称。
第二个参数是保存颜色值的2d像素(结构)数组。
“宽度”是在数组中“移动”所需的数组宽度(即列数)。
“高度”是在数组中“移动”所需的数组高度(即行数)

到目前为止的代码:

#include "functions.h"
#include <cmath>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

bool imageLoader(string filename, Pixel** image, int width, int height) {
ifstream fin(filename.c_str());

if(!fin.is_open()) {
cout << "Error: failed to open input file - " << filename << endl;
return false;
}

// get type from preamble
char type[3];
fin >> type; // should be P3
if((toupper(type[0]) != 'P') || (type[1] != '3')) { // check that type is correct
cout << "Error: type is " << type << "instead of P3" << endl;
return false;
}

int w = 0, h = 0;
fin >> w >> h;
if(w != width) { // check that width matches what was passed into the function
cout << "Error: input width (" << width << ")does not match value in file ("
<< w << ")" << endl;
return false;
}

if(h != height) { // check that height matches what was passed into the function
cout << "Error: input width (" << height
<< ") does not match value in file (" << h << ")" << endl;
return false;
}

// get maximum value from preamble
int colorMax = 0;
fin >> colorMax;
if(colorMax > 255 || colorMax < 0) {
cout << "Error: invalid color value" << colorMax << endl;
return false;
}

// THIS IS WHAT I NEED HELP WITH
// I am not sure how this is supposed to work out
// extract rgb values and place into 2d arr

/* errors :(
Pixel colors;
int colors.r[][] = {0, 0, 0};
int colors.b[][] = {0, 0, 0};
int colors.g[][] = {0, 0, 0};
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++) {
fin >> colors.r >> colors.g >> colors.g;
cout << colors.r[i][j];

}
}
*/

return true;
}

这是我包含在头文件中的头文件。请不要修改。我们只关注imageLoader:
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include <string>
#include "functions.h"

struct Pixel {
int r; // red
int g; // green
int b; // blue
};


Pixel** createImage(int width, int height);
void deleteImage(Pixel** image, int width);



bool imageLoader(std::string filename, Pixel** image, int width, int height);

如果需要任何其他信息,请通知我。谢谢。

最佳答案

如果您知道如何分配图像,则读取像素相对简单。

如果要以2D数组访问图像(分辨率是一个参数),则需要分配一个指针数组来指向数据。

例:

image -> [col0, col1, col2, ...] 
(col0, col1, col2 are pointers to columns - applies column major)

col0 -> ####### (points first columns)
col1 -> #######
col2 -> #######

另请: How do I declare a 2d array in C++ using new?

我使用了来自 here的示例图像,并添加了另外一列。

输入图像文件内容:

P3
5 4
255
0 0 0 100 0 0 0 0 0 255 0 255 0 0 255
0 0 0 0 255 175 0 0 0 0 0 0 0 0 255
0 0 0 0 0 0 0 15 175 0 0 0 0 0 255
255 0 255 0 0 0 0 0 0 255 255 255 0 0 255

循环读取像素:
Pixel colors;

for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++) {
fin >> colors.r >> colors.g >> colors.b;

//Column major - row index comes first.
image[j][i] = colors; //Copy RGB values into image
}
}

整个代码示例:
#include <string>
#include <cmath>
#include <fstream>
#include <iostream>
#include <sstream>

struct Pixel {
int r; // red
int g; // green
int b; // blue
};


using namespace std;


bool imageLoader(string filename, Pixel** image, int width, int height) {
ifstream fin(filename.c_str());

if(!fin.is_open()) {
cout << "Error: failed to open input file - " << filename << endl;
return false;
}

// get type from preamble
char type[3];
fin >> type; // should be P3
if((toupper(type[0]) != 'P') || (type[1] != '3')) { // check that type is correct
cout << "Error: type is " << type << "instead of P3" << endl;
return false;
}

int w = 0, h = 0;
fin >> w >> h;
if(w != width) { // check that width matches what was passed into the function
cout << "Error: input width (" << width << ")does not match value in file ("
<< w << ")" << endl;
return false;
}

if(h != height) { // check that height matches what was passed into the function
cout << "Error: input width (" << height
<< ") does not match value in file (" << h << ")" << endl;
return false;
}

// get maximum value from preamble
int colorMax = 0;
fin >> colorMax;
if(colorMax > 255 || colorMax < 0) {
cout << "Error: invalid color value" << colorMax << endl;
return false;
}

// THIS IS WHAT I NEED HELP WITH
// I am not sure how this is supposed to work out
// extract rgb values and place into 2d arr

/* errors :(
int colors.r[][] = {0, 0, 0};
int colors.b[][] = {0, 0, 0};
int colors.g[][] = {0, 0, 0};
*/
Pixel colors;

for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++) {
fin >> colors.r >> colors.g >> colors.b;
//cout << "(" << i << ", " << j << "): " << colors.r << " " << colors.g << " " << colors.b << endl;

//Column major - row index comes first.
image[j][i] = colors; //Copy RGB values into image
}
}

return true;
}



int main()
{
//img.ppm
//https://www.cs.swarthmore.edu/~soni/cs35/f12/Labs/extras/01/ppm_info.html

//P3
//5 4
//255
//0 0 0 100 0 0 0 0 0 255 0 255 0 0 255
//0 0 0 0 255 175 0 0 0 0 0 0 0 0 255
//0 0 0 0 0 0 0 15 175 0 0 0 0 0 255
//255 0 255 0 0 0 0 0 0 255 255 255 0 0 255

int width = 5; //Number of columns
int height = 4; //Number of rows

//Allocate memory
//////////////////////////////////////////////////////////////////////////
//Allocate array of 128 pointers (pointer to columns - since column major is required)
Pixel** image = new Pixel* [width];

//Allocate columns (each column is 96 pixels).
for (int j = 0; j < width; j++) {
image[j] = new Pixel[height];
}
//////////////////////////////////////////////////////////////////////////

bool res = imageLoader("img.ppm", image, width, height);

if (!res) {
cout << "res = " << res << endl;
}

//Free memory
//////////////////////////////////////////////////////////////////////////
//Delete columns.
for (int j = 0; j < width; j++) {
delete [] image[j];
}

//Delete image.
delete [] image;
//////////////////////////////////////////////////////////////////////////

return 0;
}

结果(“监视”窗口):

-    image[0],4    0x0000000000ba2f20 {r=0 g=0 b=0 }    Pixel *
+ [0] {r=0 g=0 b=0 } Pixel
+ [1] {r=0 g=0 b=0 } Pixel
+ [2] {r=0 g=0 b=0 } Pixel
+ [3] {r=255 g=0 b=255 } Pixel
- image[1],4 0x0000000000ba2fc0 {r=100 g=0 b=0 } Pixel *
+ [0] {r=100 g=0 b=0 } Pixel
+ [1] {r=0 g=255 b=175 } Pixel
+ [2] {r=0 g=0 b=0 } Pixel
+ [3] {r=0 g=0 b=0 } Pixel
- image[2],4 0x0000000000ba7470 {r=0 g=0 b=0 } Pixel *
+ [0] {r=0 g=0 b=0 } Pixel
+ [1] {r=0 g=0 b=0 } Pixel
+ [2] {r=0 g=15 b=175 } Pixel
+ [3] {r=0 g=0 b=0 } Pixel
- image[3],4 0x0000000000ba7510 {r=255 g=0 b=255 } Pixel *
+ [0] {r=255 g=0 b=255 } Pixel
+ [1] {r=0 g=0 b=0 } Pixel
+ [2] {r=0 g=0 b=0 } Pixel
+ [3] {r=255 g=255 b=255 } Pixel
- image[4],4 0x0000000000ba75b0 {r=0 g=0 b=255 } Pixel *
+ [0] {r=0 g=0 b=255 } Pixel
+ [1] {r=0 g=0 b=255 } Pixel
+ [2] {r=0 g=0 b=255 } Pixel
+ [3] {r=0 g=0 b=255 } Pixel

关于c++ - 从ppm文件读取RGB值,并使用结构将其存储到称为 “Image”的2d数组中(动态数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60589870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com