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