反射无滤镜CS50

问题描述 投票:0回答:3

目前,我正在做 pset4 无过滤器,反思并努力处理我编写的代码。它编译得很好,但输出图片看起来和输入图片一模一样。我尝试首先将反射图像存储在临时数组中,然后将其传输到图像数组。我找不到任何尝试过类似方法的人。这是我到目前为止所写的。

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    int i;                              //row
    int j;                              //column for img
    int z;                              //column of tmp img
    RGBTRIPLE tmpi[height][width];      //tmp img
    for (i = 0; i < height; i++)
    {
        for (j = 0, z = width; j > z; j++, z--)
        {
            image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
            image[i][j].rgbtBlue = tmpi[i][z].rgbtBlue;
            image[i][j].rgbtGreen = tmpi[i][z].rgbtGreen;
        }
    }
    for (i = 0; i < height; i ++)
    {
        for (j = 0; j < width; j++)
        {
            tmpi[i][j].rgbtRed = image[i][j].rgbtRed;
            tmpi[i][j].rgbtBlue = image[i][j].rgbtBlue;
            tmpi[i][j].rgbtGreen = image[i][j].rgbtGreen;
        }
    }
    return;
}

你能帮我一下吗?

c cs50 reflect
3个回答
1
投票

您有 2 个错误:

  1. 您首先复制未初始化的内存。
    for (i = 0; i < height; i++)
    {
        for (j = 0, z = width; j > z; j++, z--)
        {
            image[i][j].rgbtRed = tmpi[i][z].rgbtRed;

数组

tmpi
包含不确定的值,因为您从未为其分配任何内容。

您首先需要将数组复制到

tmpi
,然后才能将其复制回来。

  1. 你的循环限制是错误的:
        for (j = 0, z = width; j > z; j++, z--)
        {
            image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
            ...
  • 这里,
    z
    可能只会上升到
    width-1
  • j>z
    是错误的情况。这永远不会是真的。
  • 正确的条件是
    j<width
  • 不是错误,但你并不真正需要
    z
    。只需使用
    width-j-1
  • 也不是错误,但不需要复制结构的每个成员。您可以一次分配整个结构。

固定版本如下所示:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    int i;                              //row
    int j;                              //column for img

    RGBTRIPLE tmpi[height][width];      //tmp img

    for (i = 0; i < height; i ++)
    {
        for (j = 0; j < width; j++)
        {
            tmpi[i][j] = image[i][j];
        }
    }


    for (i = 0; i < height; i++)
    {
        for (j = 0; j < width; j++)
        {
            image[i][j] = tmpi[i][width - j - 1];
        }
    }
    return;
}

或者你甚至可以组合外循环:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    int i;                              //row
    int j;                              //column for img

    RGBTRIPLE tmpi[height][width];      //tmp img

    for (i = 0; i < height; i ++)
    {
        for (j = 0; j < width; j++)
        {
            tmpi[i][j] = image[i][j];
        }

        for (j = 0; j < width; j++)
        {
            image[i][j] = tmpi[i][width - j - 1];
        }
    }
    return;
}

或者您可以就地交换值:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    int i;                              //row
    int j;                              //column for img

    for (i = 0; i < height; i ++)
    {
        for (j = 0; j < width / 2; j++)
        {
            RGBTRIPLE temp = image[i][j];
            image[i][j] = image[i][width - j - 1];
            image[i][width - j - 1] = temp;
        }
    }
    return;
}

一旦正常工作,请随意考虑更多优化。


0
投票

您正在重新初始化颜色字节,而我们需要在这里交换像素,我建议首先创建一个交换函数,如下所示:

void swap (RGBTRIPLE *a, RGBTRIPLE *b)
{
    RGBTRIPLE temp = *a;
    *a = *b;
    *b = temp;
}

然后交换像素,因为我们要交换一半,请确保运行 j 以获得宽度/2

以下代码供您参考:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    for (int i = 0; i < height; i++)
    {
        int k = width - 1;
        for (int j = 0; j < width/2; j++)
        {
            swap(&image[i][j], &image[i][k]);
            k--;
        }
    }
    return;
}

0
投票

// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width]) 
{
    for (int i = 0; i < height; i++) /*per column*/
    {
        RGBTRIPLE temp[height][width]; 
        int n = width;
        int j = 0;
        do  /*copy in temp file*/
        {
            temp[i][width - 1] = image[i][j];
            j++;
            width--;
        }
        while (width != 0);
        
        j = 0;
        width = n;
        do
        {
            image[i][j] = temp[i][j];
            j++;
        }
        while (j != width);
    }
    return;
}

© www.soinside.com 2019 - 2024. All rights reserved.