| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 513 人关注过本帖
标题:大家看看问题出在哪?
只看楼主 加入收藏
uselessID
Rank: 2
等 级:论坛游民
帖 子:44
专家分:76
注 册:2011-8-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
大家看看问题出在哪?
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//#include <math.h>
int p[512][512],q[512][512],l[9];
int height=512,width=512;

void main()
{
    FILE *fid, *newraw,*newhead,*newbmp;
    char *ph=(char *)malloc(sizeof(char)*1078);
    int i,j,m,n,b;int a=0;
    //打开lena_gray.bmp   
    if((fid=fopen("lena_sp.bmp","rb+"))==NULL)        
    {
        printf("cannot open file\n");
        exit(0);
    }
    if((newraw=fopen("lena.raw","wb+"))==NULL)       
    {
        printf("cannot create lena.raw\n");
        exit(0);
    }
   
    //把目标文件的数据信息写到待转换的矩阵p中
    fseek(fid,1078,SEEK_SET);
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            fread(&p[i][j],sizeof(char),1,fid);
        }
    }
    //因为.bmp文件和.raw文件对于个像素的扫描顺序不同,所以在这里进行光标转换。
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            q[i][j]=p[height-i-1][j];
        }
       
    }

    //把转换后的q中的信息写入newraw  
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            fwrite(&q[i][j],sizeof(char),1,newraw);
        }
    }
    //新建head文件(用于记录文件头和调色板)
    if((newhead=fopen("newhead","wb+"))==NULL)     
    {
        printf("cannot create newhead\n");
        exit(0);
    }
    fseek(fid,0L,SEEK_SET);
    fread(ph,1078,1,fid);         
    fwrite(ph,1078,1,newhead);
    //新建bmp文件
    if((newbmp=fopen("lena2.bmp","wb+"))==NULL)       
    {
        printf("cannot create file\n");
        exit(0);
    }
    //打开newhead文件
    if((newhead=fopen("newhead","rb+"))==NULL)     
    {
        printf("cannot open file\n");
        exit(0);
    }
    //打开lena.raw   
    if((newraw=fopen("lena.raw","rb+"))==NULL)       
    {
        printf("cannot open file\n");
        exit(0);
    }
    //向lena2.bmp写入文件头
    fread(ph,1078,1,newhead);
    fwrite(ph,1078,1,newbmp);             
    //newraw导入变换数组   
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            fread(&p[i][j],sizeof(char),1,newraw);
        }
    }
    //转换坐标
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            q[i][j]=p[height-i-1][j];
        }
       
    }

    //////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////
    ///

    for (i=1;i<height-1;i++){
        for (j=1;j<width-1;j++){

         /* l[0]=q[i-1][j-1];
            l[1]=q[i-1][j];
            l[2]=q[i-1][j+1];
            l[3]=q[i][j-1];
            l[4]=q[i][j];
            l[5]=q[i][j+1];
            l[6]=q[i+1][j-1];
            l[7]=q[i+1][j];
            l[8]=q[i+1][j+1];*/这个很笨的办法是可以做出来,但是改成下边的for循环,不能得到正确结果。

       for (m=i-1;m<i+2;m++)
          {
             for (n=j-1;n<j+2;n++)
              {
                 l[a++]=q[m][n];
                
             }
            
             //依次取出九个方阵的元素付给数组l

              }

          //冒泡法对取出的九个元素进行排序
          for (m=0;m<8;m++)
          {
              for (n=0;n<8-m;n++)
              {if (l[n]<l[n+1])
              {b=l[n];
              l[n]=l[n+1];
              l[n+1]=b;}
              }
          }
          //取出中间大小的数值付给循环当前元素
          q[i][j]=l[4];

        }
    }
    /////////////////////////////////////////////
    //////////////////////////////////////////////
    /////////////////////////////////////////////
   
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            fwrite(&q[i][j],sizeof(char),1,newbmp);
        }
    }
   
    fclose(newbmp);
    fclose(newraw);
    fclose(newhead);
    fclose(fid);
}
2011-10-16 23:36
uselessID
Rank: 2
等 级:论坛游民
帖 子:44
专家分:76
注 册:2011-8-22
收藏
得分:0 
哎 不该把整段代码都贴上 貌似太乱了 。。其实就是////..../////之间的部分 大家帮忙看看。。。
 
2011-10-16 23:45
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:20 
程序代码:
for (i=1;i<height-1;i++){
        for (j=1;j<width-1;j++){
        a=0;///////////////////////////////

       for (m=i-1;m<i+2;m++)
          {
             for (n=j-1;n<j+2;n++)
              {
                 l[a++]=q[m][n];
               
             }
           
             //依次取出九个方阵的元素付给数组l

              }

          //冒泡法对取出的九个元素进行排序
          for (m=0;m<8;m++)
          {
              for (n=0;n<8-m;n++)
              {if (l[n]<l[n+1])
              {b=l[n];
              l[n]=l[n+1];
              l[n+1]=b;}

 }
          }
          //取出中间大小的数值付给循环当前元素
          q[i][j]=l[4];

        }
    }
2011-10-17 00:03
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
注意一下风格。我本本没有电了,就不帮你改风格了~
2011-10-17 00:06
uselessID
Rank: 2
等 级:论坛游民
帖 子:44
专家分:76
注 册:2011-8-22
收藏
得分:0 
回复 4楼 laznrbfe
谢谢啊 ,但是为什么要在for循环里对a赋值呢?能给我解释下吗?
2011-10-17 01:24
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 5楼 uselessID
因为你需要l[0]到l[8];而不是l[0]到l[N].重新把a赋值0,为了确保每次都从l[0]开始。
2011-10-17 08:07
cosam
Rank: 4
等 级:业余侠客
帖 子:146
专家分:259
注 册:2011-8-25
收藏
得分:0 
全在main()里搞定 ~~```
2011-10-17 08:20
uselessID
Rank: 2
等 级:论坛游民
帖 子:44
专家分:76
注 册:2011-8-22
收藏
得分:0 
回复 6楼 laznrbfe
恩 对对。很感谢。
2011-10-17 19:34
快速回复:大家看看问题出在哪?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021326 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved