Эффект размытия на bitmap с использованием C

Я пишу программу, использующую фильтр размытия на mp4. Я exctracting bmp файлы из mp4 с ffmpeg. Но результат размытия неправильный. Некоторые части изображения были правильно размыты, но другие части имели неправильные цвета.

оригинальное изображение http://sofru.miximages.com/c/XS4yqNd.jpg

размытое изображение http://sofru.miximages.com/c/IbcxxA4.jpg

Это код для чтения bmp, применяя размытие и запись в файл bmp.

int blur(char* input, char *output) { //variable dec: FILE *fp,*out; bitmap_header* hp; int n,x,xx,y,yy,ile, avgR,avgB,avgG,B,G,R; char *data; int blurSize = 5; //Open input file: fp = fopen(input, "r"); if(fp==NULL){ //cleanup } //Read the input file headers: hp=(bitmap_header*)malloc(sizeof(bitmap_header)); if(hp==NULL) return 3; n=fread(hp, sizeof(bitmap_header), 1, fp); if(nbitmapsize); if(data==NULL){ //cleanup } fseek(fp,sizeof(char)*hp->fileheader.dataoffset,SEEK_SET); n=fread(data,sizeof(char),hp->bitmapsize, fp); if(n<1){ //cleanup } for(xx = 0; xx width; xx++) { for(yy = 0; yy height; yy++) { avgB = avgG = avgR = 0; ile = 0; for(x = xx; x width && x < xx + blurSize; x++) { for(y = yy; y height && y width*3 + 0]; avgG += data[x*3 + y*hp->width*3 + 1]; avgR += data[x*3 + y*hp->width*3 + 2]; ile++; } } avgB = avgB / ile; avgG = avgG / ile; avgR = avgR / ile; data[xx*3 + yy*hp->width*3 + 0] = avgB; data[xx*3 + yy*hp->width*3 + 1] = avgG; data[xx*3 + yy*hp->width*3 + 2] = avgR; } } //Open output file: out = fopen(output, "wb"); if(out==NULL){ //cleanup } n=fwrite(hp,sizeof(char),sizeof(bitmap_header),out); if(nfileheader.dataoffset,SEEK_SET); n=fwrite(data,sizeof(char),hp->bitmapsize,out); if(n<1){ //cleanup } fclose(fp); fclose(out); free(hp); free(data); return 0; } 

Я не знаю, где проблема. Пожалуйста помоги!

Кажется, char signed на вашей платформе. Из-за этого все значения цвета больше 127 интерпретируются как отрицательные числа ( 256 меньше исходного значения). Это вызывает все странные цветовые эффекты.

Чтобы исправить это, вы можете объявлять data как unsigned char* :

 unsigned char *data;