Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用结构和指针更改图像大小/分辨率_C_Function_Pointers_Struct_Pixels - Fatal编程技术网

在C中使用结构和指针更改图像大小/分辨率

在C中使用结构和指针更改图像大小/分辨率,c,function,pointers,struct,pixels,C,Function,Pointers,Struct,Pixels,我们学校有一项任务要完成,我们需要改变一幅图像(反转颜色,切换颜色,旋转90度,放大一倍),而现在我正试图通过加倍分辨率来放大一倍图像,但不知道如何访问和更改地址。 我们得到了两个函数,一个可以加载图像,另一个可以保存图像,所以我们不必担心,我们也得到了两个结构,一个带有rgb值,一个带有高度和宽度(以像素为单位) 我一直在四处寻找,但没有真正找到任何有效的方法,或者我只是做错了。我也尝试过很多事情,但都没有成功 这是我的主要观点 #include <stdio.h> #includ

我们学校有一项任务要完成,我们需要改变一幅图像(反转颜色,切换颜色,旋转90度,放大一倍),而现在我正试图通过加倍分辨率来放大一倍图像,但不知道如何访问和更改地址。
我们得到了两个函数,一个可以加载图像,另一个可以保存图像,所以我们不必担心,我们也得到了两个结构,一个带有rgb值,一个带有高度和宽度(以像素为单位)

我一直在四处寻找,但没有真正找到任何有效的方法,或者我只是做错了。我也尝试过很多事情,但都没有成功

这是我的主要观点

#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;
    }

我们给出的两个结构是:

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

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

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

编辑: 这是我的头文件:

#ifndef STUDENTFUNCTIONS_H
#define STUDENTFUNCTIONS_H

#include <functions.h>

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

#endif
\ifndef STUDENTFUNCTIONS\u H
#定义学生函数
#包括
颜色(图像平面);
颜色(图像素);
void makebiger(图像*普通);
#恩迪夫
我还没有调整像素的大小,因为我试图找出如何提高图像的分辨率,以便能够调整像素的大小,这就是我的想法


为了提高图像的分辨率,即放大图像,仅使
平面->高度
平面->宽度
(之前没有
*
)变大是不够的,相反,还需要增加为像素行和列阵列分配的内存-除非它们已经被
readImage()
过度分配,但读取访问冲突表明它们没有。然而,我们无法可靠地确定如何重新分配像素内存,同时我们也不知道阵列最初是如何分配的,因此给定的任务不可能只使用给定的信息—这是您老师的一个令人遗憾的错误。

*foo->bar
解析为
*(foo->bar)
->
的快捷方式(*)。
在你的例子中,
*普通->高度
意味着
*(*普通)。高度
和那是一个
*
太多了。只要做
普通->高度
“给定两个函数,一个可以加载图像,另一个可以保存图像,所以我们不需要担心”->hmm。尝试保存到不同的文件。
writeImage(“test.png2”和普通)
我在这里维护了我的简单图像处理功能。调整大小可以用很多不同的方法来完成。最简单的方法是简单地将像素复制到二次方的大小,但这会产生非常像素化的结果。@Urielli虽然我同意你所描述的语义,但OP反转颜色的入口点可以通过值来传递代码所做的唯一一件事就是更改
像素
成员(指针)中未引用的数据,仍然会导致相同的数据,无论
plain
是否按值传递。
makebiger
函数修改
Image
的值成员,从而按地址传递。尽管看起来很奇怪,
invertColor
switchColor
的此接口应该可以工作。也就是说,
makebiger
是以多种方式中断:错误的解引用,并且没有调整
像素的大小。
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;
#ifndef STUDENTFUNCTIONS_H
#define STUDENTFUNCTIONS_H

#include <functions.h>

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

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

}