我为什么不在Roller2.raw上写任何东西?

时间:2016-12-14 14:07:43

标签: c fwrite fread imagefilter

我得到了用C编写的以下代码,但我对这个图像过滤程序有一个小问题。问题符合常规的一切,但是我的图像roller2.raw没有根据迭代次数进行更改(在rawpixels.net中检查)。它应该读取roller1并写入roller2。我是以错误的方式写作吗?以下代码如下

#include <stdio.h>
#include <stdlib.h>


typedef unsigned char image[251][256];

int main() 
{

 int h,i,j,k,l,sum,iterations;
 image *datain, *dataout;

 FILE *f , *g; 
 f = fopen("/home/osboxes/prestandaoptimering/roller1.raw", "r"); 
 g = fopen("/home/osboxes/prestandaoptimering/roller2.raw", "w"); 

 datain = (image*)malloc(sizeof(image));
 dataout = (image*)malloc(sizeof(image));
 fread(*datain, sizeof(image), 1, f); 


 printf("Enter number of iterations:");
 scanf("%d", &iterations);
 getchar(); 

 printf("Computing result\n");


 for( i = 0; i <= 250; i ++) {
        for( j = 0; j <= 255; j ++) {
                (*dataout) [i][j] = (*datain) [i][j]; 
    }
 }



 for( h = 1; h <= iterations; h ++) {

        for( i = 1; i <= 249; i ++) {

                for( j = 1; j <= 254; j ++) {

                        sum = 0;
                        for( k = -1; k <= 1; k ++) {
                            for( l = -1; l <= 1; l ++) {
                                sum = sum + (*datain)[i+k][j+l];
                }

                        (*dataout)[i][j] = (sum + (*datain)[i][j]*7) / 16;
            }
                }
                for( i = 0; i <= 250; i ++) {
                    for( j = 0; j <= 255; j ++) {
                        (*datain)[i][j] = (*dataout)[i][j];
            }
        }
    }
 }

 printf("Writing result\n");
 fwrite(dataout, sizeof(image), 1, g);
 if (f != NULL) {
    fclose(f); 
 }
 f = NULL;
 if (g != NULL) {
    fclose(g);
 }
 g = NULL;

 free(datain);
 free(dataout);
 return 0; 
}

1 个答案:

答案 0 :(得分:1)

我认为问题出在iterations循环中。

for( h = 1; h <= iterations; h ++) 
{
    for( i = 1; i <= 249; i ++) 
    {
        for( j = 1; j <= 254; j ++) 
        {
            sum = 0;
            for( k = -1; k <= 1; k ++) 
            {
                for( l = -1; l <= 1; l ++) 
                {
                    sum = sum + (*datain)[i+k][j+l];
                }
            }

            //This should be outside the k and l loop.
            (*dataout)[i][j] = (sum + (*datain)[i][j]*7) / 16;
        }

        //You should use different variable name instead of i. OR declare 'i' again for `for` loop.
        for(int i2 = 0; i2 <= 250; i2 ++)
        {
            for( j = 0; j <= 255; j ++) 
            {
                (*datain)[i2][j] = (*dataout)[i2][j];
            }
        }
    }
 }