我正在尝试用C编写一个将高斯滤镜应用于图像的程序。我已经成功创建了使用libpng读写图像的函数,以及创建了与高斯函数关联的内核的函数。
我的代码受http://zarb.org/~gc/html/libpng.html这个代码的启发,并且正在执行基本任务。例如,我可以增加红色值并保存图像。问题是,当我尝试应用卷积矩阵时,当我尝试访问ptr
指针的值时会遇到分段错误。我不明白为什么先读这个值而不是现在读。同样在printf
与gdb之前,我可以读取链接到ptr的值。这里是gdb的段错误:
0x0000555555555991 in convolute (image=0x7fffffffda80, matrice=0x7fffffffda78) at imageTools.c:157
157 printf("%d",ptr[0]);
我还想知道,制作循环来计算每个像素的值是否非常有效,因为它进行了大量的计算,而且我认为在像Photoshop这样的软件中,这几乎是瞬时的,因此需要花费很多时间。
这是我的代码:
imageTools.c
void convolute(image_t* image, double** matrice){
image_t imageTemp = *image;
int x,y,i,j;
png_byte r,v,b;
for(x=2;x<image->height-2;x++){
for(y=2;y<image->width-2;y++){
png_byte* new_row = imageTemp.row_pointers[x];
png_byte* new_ptr = &(new_row[y*4]);
/*png_byte* new_pixel = malloc(4*sizeof(png_byte));*/
r=0;v=0;b=0;
for(i=-2;i<3;i++){
png_byte* row = image->row_pointers[i];
for(j=-2;j<3;j++){
png_byte* ptr = &(row[j*4]);
printf("%d",ptr[0]); /* Here is the segfault*/
r += (png_byte) ptr[0];
v += (png_byte) ptr[1];
b += (png_byte) ptr[2];
}
}
printf("R: %d, V: %d, B: %d",r,v,b);
new_ptr[0] = r;
new_ptr[1] = v;
new_ptr[2] = b;
}
}
image = &imageTemp;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define PNG_DEBUG 3
#include <png.h>
#include "imageTools.h"
#include "filtreGaussien.h"
int main()
{
image_t image;
double** noyau;
int i,j;
if(read_png_file("test.png", &image)){
printf("OK!\n");
printf("Height: %d, Width: %d\n", image.height, image.width);
noyau = noyauGaussien(1.0);
for(i=0;i<5;i++){
printf("| ");
for(j=0;j<5;j++){
printf("%f | ",noyau[i][j]);
}
printf("\n");
}
convolute(&image, &noyau);
write_png_file("test2.png", &image);
} else {
printf("An error as occured. Exiting...");
}
return 0;
}
image_t
结构:
typedef struct{
png_bytep* row_pointers;
int width;
int height;
png_byte color_type;
png_byte bit_depth;
}
image_t;