C - 调整图像大小/放大图像

时间:2017-01-05 14:15:33

标签: c resize

我只是想说我是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);
}

如果有人可以帮助我,我会非常感激^^
谢谢!

1 个答案:

答案 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.heighttempImage.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这样的字符的指针吗?