我只是想说我是C的新手。好吧,尽管如此,我在圣诞假期的任务是制作一个以各种方式操纵PNG图像的程序。我已经完成了大部分工作,但在尝试编写应该放大图像的程序时遇到了问题。我试过了,我已经某事了。虽然我很确定这一切都错了......
void enlargeImage(Image plain, char *imageInput[])
{
Image tempImage;
Pixel** pixels;
int scale = 2;
pixels = malloc(plain.height * sizeof(Pixel*) *scale);
for (int i = 0; i < plain.height; i++)
{
pixels[i] = malloc(plain.width * sizeof(Pixel*) * scale);
}
tempImage.pixels = pixels;
tempImage.height = plain.height * scale; //Can I even do this?? Or is it completely wrong?
tempImage.width = plain.width * scale;
// I've tried a few variations of this code
for (int height = 0; height < plain.height; height++)
{
for (int width = 0; width < plain.width; width++)
{
tempImage.pixels[height][width] = plain.pixels[height][width];
}
}
writeImage(imageInput, &tempImage); //This is a function written by my teachers. This is also where I get an error. I'm suspecting it's because I've doubled the size of tempImage ??
free(tempImage.pixels);
}
如果有人可以帮助我,我会非常感激^^
谢谢!
答案 0 :(得分:0)
1。分配应该是这样的:
tempImage.height = plain.height * scale;
tempImage.width = plain.width * scale;
pixels = malloc(tempImage.height * sizeof(Pixel*));
if (pixels == NULL) return;
for (int i = 0; i < tempImage.height; i++)
{
pixels[i] = malloc(tempImage.width * sizeof(Pixel));
if (pixels[i] == NULL)
{
for (int j = 0; j < i; j++) free(pixels[j]);
free(pixels);
return;
}
}
tempImage.pixels = pixels;
要点是:
tempImage.height
和tempImage.width
,避免两次乘法运算。sizeof(char)
被定义为1并因此乘以它并不是有害的,但它似乎会产生混乱并使阅读程序更难。pixels[i]
的元素类型为Pixel
。因此sizeof(Pixel)
应该在第二个sizeof(Pixel*)
中乘以malloc()
而不是malloc()
。NULL
的返回值,以避免解除引用malloc()
,for (int height = 0; height < tempImage.height; height++)
{
for (int width = 0; width < tempImage.width; width++)
{
tempImage.pixels[height][width] = plain.pixels[height / scale][width / scale];
}
}
在失败时从tempImage
返回,并调用未定义的行为。 2。转换应该是这样的:
malloc()
要点是:
free(tempImage.pixels);
)的所有像素的值。通过for (int i = 0; i < tempImage.height; i++)
{
free(tempImage.pixels[i]);
}
分配的缓冲区的初始值是不确定的,使用它们将调用未定义的行为。 3。您正在按free(tempImage.pixels);
释放行列表,但您应该通过添加
tempImage.pixels
之前行pixels
。
请注意,free()
和free()
指向同一个数组,因此您不必(也不得)同时使用writeImage
:使用{{1}只为其中一个。
4。不知道void enlargeImage(Image plain, char *imageInput[])
的实际签名,
writeImage(imageInput, &tempImage);
和
writeImage
看起来很奇怪。你确定char *imageInput
的第一个参数应该是指向字符指针的指针,而不是指向像edittext
这样的字符的指针吗?