关于空间分辨率转换编程-bmp图像

Regarding spatial resolution conversion programming - bmp image

我想问一些简单的空间分辨率操作,只用c语言。我在下面完成了我的编程,它成功地被编译了,但是由于某些原因,当我尝试 运行 它时,程序卡在了中间。真心希望大家帮帮忙。我是这方面的新手。

#include<stdio.h>

#define width 640
#define height 581

int main(void)
{
    FILE *fp; 
    unsignedchar header[54]; 
    unsignedchar img_work[width][height][3]; 
    char input_file[128],output_file[128]; 
    int v, h, w, i, c, s, ave_w[width], ave_h[height], average_h, average_w;

    /*------------Reading image------------*/

    printf("Enter name of the file¥n---");
    scanf("%s",input_file);
    printf("The file that would be processed is %s.¥n", input_file);
    fp=fopen(input_file,"rb"); 
    fread(header,1,54,fp); 
    fread(img_work,1,width*height*3,fp); 
    fclose(fp);

     /*------------Spatial Resolution Program------------*/

    printf ("enter level of spatialization-- ");
    scanf ("%d", &v);

    for (i=0; i<v; i++) {
        s = s + s;
    }

    for(c=0; c<3; c++){
        for(h=0; h<height; h++){
            for(w=0; w<width; w=w+s){
                average_w = 0;

                for (i=0; i<s; i++) {
                    ave_w = img_work[w+i][h][c] / s;
                    average_w = average_w + ave_w;
                }

                for (i=0; i<width; i=i+s) {
                    img_work[w+i][h][c] = average_w;
                }
            }
        }
    }

    for(c=0; c<3; c++){
        for(w=0; w<width; w++){
            for(h=0; h<height; h=h+s){
                average_h = 0;
                for (i=0; i<s; i++) {
                    ave_h = img_work[w][h+i][c] / s;
                    average_h = average_h + ave_h;
                }
                for (i=0; i<height; i=i+s) {
                    img_work[w][h+i][c] = average_h;
                }
            }
        }
    }

    /*------------Writing File------------*/

    printf("Enter the name of the file that would be saved.¥n---");
    scanf("%s",output_file); 
    printf("Name of the file that would be saved is %s.¥n",output_file);
    fp=fopen(output_file,"wb"); 
    fwrite(header,1,54,fp); 
    fwrite(img_work,1,width*height*3,fp); 
    fclose(fp);

    printf("End.¥n");

    return 0;
}

我真的是初学者,不足之处还请见谅

您的代码存在几个问题:

  • s 未初始化。因此,当您在赋值 s = s + s 中访问它的值时,结果是未定义的。 s甚至可能是负数。初始化它:s = 1;

  • 你的图片表示有误。您从文件中逐字读取像素数据。 BMP 格式是行优先的,所以你的像素数据应该是 img_work[height][width][3] 并且所有访问都应该交换它们的第一维和第二维。

  • BMP 格式也需要在每一行的末尾填充。您的 fixed-size 宽度 640 不需要它,但是当您想让您的实现更通用时,请记住这一点。

  • 你真的不需要辅助变量ave_wave_h。最重要的是,您不需要它们是数组。

  • 你的身高不能被 s 整除。这意味着在最后一次循环中,h + i 将越界。 (这同样适用于宽度,但值 640 至少在 7 级以下是安全的。)您可以计算一个 "actual s" 将针对顶部和右侧进行调整。

  • 计算平均值时最好先求和再除以s一次。您正在处理整数和整数除法截断。例如 3/4 为零。因此,(3/4 + 3/4 + 3/4 + 3+4) 也为零,但 (3 + 3 + 3 + 3) / 4 为 3。您可以注意到更大程度减少的效果,如果您对总和进行除法,主要是白色的图像会变得更暗。

这是一个基于您的程序,将上述要点付诸实践:

#include <stdio.h>

#define width 640
#define height 581

int main(void)
{
    FILE *fp; 
    unsigned char header[54]; 
    unsigned char img_work[height][width][3]; 
    char input_file[128];
    char output_file[128]; 
    int v, h, w, i, c, s;

    /*------------Reading image------------*/

    printf("Enter name of the file\n---");
    scanf("%s",input_file);
    printf("The file that would be processed is %s.\n", input_file);
    fp=fopen(input_file,"rb"); 
    fread(header,1,54,fp); 
    fread(img_work,1,width*height*3,fp); 
    fclose(fp);

     /*------------Spatial Resolution Program------------*/

    printf("enter level of spatialization-- ");
    scanf("%d", &v);

    s = 1;
    for (i = 0; i < v; i++) {
        s = s + s;
    }

    for (c = 0; c < 3; c++) {
        for (h = 0; h < height; h++) {
            for (w = 0; w < width; w = w + s) {
                int average_w = 0;
                int ss = s;

                if (w + ss > width) ss = width % s;

                for (i = 0; i < ss; i++) {
                    average_w = average_w + img_work[h][w + i][c];
                }

                for (i = 0; i < ss; i++) {
                    img_work[h][w + i][c] = average_w / ss;
                }
            }
        }
    }

    for (c = 0; c < 3; c++) {
        for (w = 0; w < width; w++) {
            for (h = 0; h < height; h = h + s) {
                int average_h = 0;
                int ss = s;

                if (h + ss > height) ss = height % s;

                for (i = 0; i < ss; i++) {
                    average_h = average_h + img_work[h + i][w][c];
                }
                for (i = 0; i < ss; i++) {
                    img_work[h + i][w][c] = average_h / ss;
                }
            }
        }
    }

    /*------------Writing File------------*/

    printf("Enter the name of the file that would be saved.\n---");
    scanf("%s",output_file); 
    printf("Name of the file that would be saved is %s.\n",output_file);
    fp=fopen(output_file,"wb"); 
    fwrite(header,1,54,fp); 
    fwrite(img_work,1,width*height*3,fp); 
    fclose(fp);

    printf("End.\n");

    return 0;
}

这仍然是一个具有固定图像大小的 quick-and-dirty 程序。它不强制图像的实际大小(可以从 header 中读取)与固定大小匹配或者颜色深度相同或者您甚至获得足够的像素数据,为此您应该检查 fread.

的 return 值