【问题标题】:Changing an images size/resolution using struct and pointers in C使用 C 中的结构和指针更改图像大小/分辨率
【发布时间】:2016-12-27 21:05:59
【问题描述】:

我们一直在学校完成一项任务,我们需要更改图像(反转颜色,切换颜色,将其旋转 90 度,将大小加倍,放大),现在我正在尝试通过将其分辨率加倍来使其大小加倍,但无法弄清楚如何访问该地址并对其进行更改。 我们已经获得了两个函数,一个可以加载图像,另一个可以保存图像,所以我们不必担心,我们还获得了两个结构体,一个具有 rgb 值,一个具有高度和宽度(以像素为单位)。

我一直在环顾四周,但没有真正找到任何有效的方法,或者我只是做错了。我也尝试了多种方法,但均未成功。

这是我的 main.c:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "studentFunctions.h"

int main()
{
    Image plain;
    char selection;
    readImage("test.png", &plain);

    printf("What do you wish to do?\nInvert colors = i.\nSwitch colors = s.\nDoulbe size = d.");
    scanf("%c", &selection);

    switch (selection)
    {

    case 'i':
        invertColor(plain);
        break;

    case 's':
        switchColor(plain);
        break;

    case 'd':
        makeBigger(plain);
        break;
    }

    printf("Saving PNG\n");
    writeImage("test.png", &plain);

    return 0;
    }

这是我的function.c:

#include "studentFunctions.h"


void invertColor(Image plain)
{
    for (unsigned int i = 0; i < plain.height; i++)
    {
        for (unsigned int j = 0; j < plain.width; j++)
        {
            plain.pixels[i][j].r = 255 - (plain.pixels[i][j].r);
            plain.pixels[i][j].g = 255 - (plain.pixels[i][j].g);
            plain.pixels[i][j].b = 255 - (plain.pixels[i][j].b);
        }
    }
}

void switchColor(Image plain)
{
    int temp;

    for (unsigned int i = 0; i < plain.height; i++)
    {
        for (unsigned int j = 0; j < plain.width; j++)
        {
            temp = plain.pixels[i][j].r;

            plain.pixels[i][j].r = plain.pixels[i][j].b;
            plain.pixels[i][j].b = plain.pixels[i][j].g;
            plain.pixels[i][j].g = temp;
        }
    }
}

void makeBigger(Image* plain)
{
    *plain->height *= 2;
    *plain->width *= 2;

}

如您所见,我试图指向 plain.height 和 plain.width 来更改图像分辨率,但这不起作用。当悬停在“plain”上时,它说“'*' 的操作数必须是一个指针”。这实际上是什么意思,正确的做法是什么?

我们给出的两个函数如下所示:

void writeImage(char* filename, Image *img);

void readImage(char *filename, Image *img);

我们给出的两个结构是:

typedef struct image {
Pixel **pixels;
unsigned int height;
unsigned int width;
} Image;

typedef struct pixel {
uint8_t r;
uint8_t g;
uint8_t b;
} Pixel;

我们无法编辑或查看两个给定的函数或两个结构。

最好我想要一个解释,也许是一个简单的例子,而不是一个直接的答案,因为我正在努力学习和理解这一点。最后一点,我是一般编程的新手,尤其是 C 语言,希望它足够清楚。 感谢您的回答。

编辑: 这是我的头文件:

#ifndef STUDENTFUNCTIONS_H
#define STUDENTFUNCTIONS_H

#include <functions.h>

void invertColor(Image plain);
void switchColor(Image plain);
void makeBigger(Image* plain);

#endif

【问题讨论】:

  • *foo-&gt;bar 解析为*(foo-&gt;bar)
  • -&gt;(*). 的快捷方式,在您的情况下,*plain-&gt;height 表示*(*plain).height,这是一个* 太多了。只需plain-&gt;height
  • "给定两个函数,一个可以加载图像,另一个可以保存图像,所以我们不需要担心这个" --> 嗯。尝试保存到 _different 文件。 writeImage("test.png2", &amp;plain);
  • 我在这里维护我的简单图像处理功能github.com/MalcolmMcLean/babyxrc 调整大小可以通过多种不同的方式完成。最简单的方法是简单地将像素复制为 2 的幂,但这会产生非常像素化的结果。
  • @UrielEli 虽然我同意您所描述的语义,但 OP 用于反转颜色的入口点可以按值传递。代码所做的唯一事情是从 pixels 成员(指针)更改 dereferenced 数据,仍然会导致相同的数据,无论 plain 是否按值传递。 makeBigger 函数修改Image 的值成员,因此通过地址传递。虽然看起来很奇怪,但 invertColorswitchColor 的这个界面应该可以工作。也就是说,makeBigger 在多个方面被破坏:错误的取消引用,以及没有调整 pixels 的大小。

标签: c function pointers struct pixels


【解决方案1】:
void makeBigger(Image* plain)
{
    *plain->height *= 2;
    *plain->width *= 2;

}

我还没有调整像素大小,因为我试图弄清楚如何提高图像的分辨率以便能够调整像素大小,这就是我想这样做的方式。

为了提高图像的分辨率,i。 e.要放大它,使plain-&gt;heightplain-&gt;width(没有* 之前)更大是不够的,还需要增加为像素行和列数组分配的内存——除非它们已经已被readImage() 过度分配,但读取访问冲突 表明它们没有。然而,我们无法可靠地确定如何重新分配像素内存,而我们不知道数组最初是如何分配的,因此仅凭给定的信息就不可能完成给定的任务——这是你老师的一个令人遗憾的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多