C++ 第二次使用新参数调用矩形绘图函数时出现问题

C++ 第二次使用新参数调用矩形绘图函数时出现问题,c++,C++,我试图创建一个程序,创建一个数字数组,作为PGM图像文件读取。我可以让程序在矩形函数的一个实例起作用的情况下写入文本文件,但第二个实例不起作用。我不明白为什么函数的第二个实例没有改变数组。打印函数或矩形函数是否有问题?任何一点正确的方向都是值得赞赏的,经过三个小时的视频,我不知所措 #include "stdafx.h" #include <fstream> #include <iostream> #include <string> using namesp

我试图创建一个程序,创建一个数字数组,作为PGM图像文件读取。我可以让程序在矩形函数的一个实例起作用的情况下写入文本文件,但第二个实例不起作用。我不明白为什么函数的第二个实例没有改变数组。打印函数或矩形函数是否有问题?任何一点正确的方向都是值得赞赏的,经过三个小时的视频,我不知所措

#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

const int IMAGE_HEIGHT = 200;
const int IMAGE_WIDTH = 300;
const int GREY_SCALE = 255;

const int RECT1_TOP = 10;
const int RECT1_LEFT = 10;
const int RECT1_HEIGHT = 25;
const int RECT1_WIDTH = 50;
const int RECT1_GREY = 255;

const int RECT2_TOP = 50;
const int RECT2_LEFT = 30;
const int RECT2_HEIGHT = 25;
const int RECT2_WIDTH = 50;
const int RECT2_GREY = 200;

void createImage(unsigned char image[][IMAGE_WIDTH], int height);

bool writeImage(const unsigned char image[][IMAGE_WIDTH], int height);

void drawRect(unsigned char image[][IMAGE_WIDTH],
              int imgHeight,
              int rectTop,
              int rectLeft,
              int rectHeight,
              int rectWidth,
              unsigned char grayLevel);

int main()
{

    unsigned char image[IMAGE_HEIGHT][IMAGE_WIDTH] = { };

    createImage(image, IMAGE_HEIGHT);

    writeImage(image, IMAGE_HEIGHT);

    return 0;
}

void createImage(unsigned char image[][IMAGE_WIDTH], int height)
{
    drawRect(image,
             height,
             RECT1_TOP,
             RECT1_LEFT,
             RECT1_HEIGHT,
             RECT1_WIDTH,
             RECT1_GREY);

    drawRect(image,
             height,
             RECT2_TOP,
             RECT2_LEFT,
             RECT2_HEIGHT,
             RECT2_WIDTH,
             RECT2_GREY);
}

void drawRect(unsigned char image[][IMAGE_WIDTH],
              int imgHeight,
              int rectTop,
              int rectLeft,
              int rectHeight,
              int rectWidth,
              unsigned char grayLevel)
{
    for (int rectRow = rectTop; rectRow < rectHeight; rectRow++)
    {
        for (int rectCol = rectLeft; rectCol < rectWidth; rectCol++)
            image[rectRow][rectCol] = { grayLevel };
    }
}

bool writeImage(const unsigned char image[][IMAGE_WIDTH], int height)
{
    ofstream makeShapes;

    makeShapes.open("makeShapes.txt");

    makeShapes << "P2 \n";
    makeShapes << IMAGE_WIDTH << " " << height << "\n";
    for (int imageRow = 0; imageRow < height; imageRow++)
    {
        for (int imageColumn = 0; imageColumn < IMAGE_WIDTH; imageColumn++)
            makeShapes << static_cast<int>(image[imageRow][imageColumn]) << ' ';
        makeShapes << endl;
    }

    makeShapes.close();

    return 1;
}
#包括“stdafx.h”
#包括
#包括
#包括
使用名称空间std;
const int IMAGE_HEIGHT=200;
const int IMAGE_WIDTH=300;
常数int灰度=255;
const int RECT1_TOP=10;
const int RECT1_LEFT=10;
const int RECT1_HEIGHT=25;
const int RECT1_WIDTH=50;
const int RECT1_GREY=255;
const int RECT2_TOP=50;
const int RECT2_LEFT=30;
const int RECT2_HEIGHT=25;
const int RECT2_WIDTH=50;
const int RECT2_GREY=200;
void createImage(无符号字符图像[][图像宽度],整数高度);
bool writeImage(常量无符号字符图像[][图像宽度],整数高度);
void drawRect(无符号字符图像[][图像宽度],
在灯光下,
int RECTOP,
int左,
整数矩形高度,
整数矩形宽度,
无符号字符(灰度级);
int main()
{
无符号字符图像[图像高度][图像宽度]={};
createImage(图像、图像和高度);
写入图像(图像、图像高度);
返回0;
}
void createImage(无符号字符图像[][图像宽度],整数高度)
{
drawRect(图像,
高度,
右1_顶部,
左1_,,
1_高度,
矩形1_宽度,
矩形(1_灰);
drawRect(图像,
高度,
2_顶部,
左二,
2_高度,
矩形2_宽度,
矩形(2_灰);
}
void drawRect(无符号字符图像[][图像宽度],
在灯光下,
int RECTOP,
int左,
整数矩形高度,
整数矩形宽度,
无符号字符(灰度)
{
for(int-rectRow=rectTop;rectRowmakeShapes首先,您在写入文件时丢失了一段数据。在宽度和高度之后,您需要添加通道可以接受的最大值。因此,您的文件输出应该如下所示:

P2
300 200
255
<...image data...>

很抱歉,我不知道是否有人将代码复制粘贴到visual Studio中或直接从网站上阅读。我应该花时间对其进行适当格式化。现在应该更好了。当写入图像的函数总是写入同一文件时,您希望如何保存第二个图像很明显,第二个图像最终只会覆盖第一个图像?如何使调用矩形函数的两个实例都替换了数组指定区域中的零占位符值?流
的默认打开行为是写在文件上,而不是附加到文件上。然后选择适当的模式.
for(int-rectRow=rectTop;rectRow
这个文件的最终条件不是
rectTop+recthheight
?宽度相同。通常也建议文件中的行不超过70行,但我没有注意到任何现代图像处理软件对这一点要求太严格。这让代码按照我的预期工作。我想我只是没有这样做用我的代码明确我的实际出发点。谢谢你指出我的错误!
for (int rectRow = rectTop; rectRow < rectTop + rectHeight; rectRow++)
{
    for (int rectCol = rectLeft; rectCol < rectLeft + rectWidth; rectCol++)
        image[rectRow][rectCol] = { grayLevel };
}