小妹现在实在没分数了,希望各位高手帮我看看,急用呢!
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <MALLOC.H>
#include <math.h>
#include <iostream.h>
#include "direct.h"typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned char BYTE; 
float s(float x);     /*计算a、c两个系数矩阵*/
float ABC(float a[],float b[],float c[]);/*三个矩阵方程,计算RGB像素*//*宏定义bmp相关数据结构*/
typedef struct tagBITMAPFILEHEADER {
WORD bfType; 
DWORD bfSize; 
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;      /*位图文件头*/typedef struct tagBITMAPINFOHEADER{ 
DWORD biSize;    
DWORD biWidth;    
DWORD biHeight;   
WORD biPlanes;   
WORD biBitCount;   
DWORD biCompression; 
DWORD biSizeImage; 
DWORD biXPelsPerMeter; 
DWORD biYPelsPerMeter; 
DWORD biClrUsed; 
DWORD biClrImportant; 
} BITMAPINFOHEADER;        /*位图信息头格式定义*/typedef struct tagRGBTRIPLE { 
BYTE rgbBlue; 
BYTE rgbGreen; 
BYTE rgbRed;
} RGBTRIPLE;/*位图阵列格式定义  构成一个3字节的RGBTRIPLE。*/
/*bmp数据结构宏定义结束*/BITMAPFILEHEADER bmfHeader;    /*位图文件头*/
BITMAPINFOHEADER bmiHeader;    /*位图信息头 */
RGBTRIPLE* m_ImageData;       /*图象数据指针*/
void main()
{
  int i,j;
  int zoom=2;
  float x_oldf,y_oldf;
  float u,v;
  long x_old,y_old,x_new,y_new;    
  float num=(float)1.0/zoom;
  long w_old;           
  long h_old;           
  long w_new;    
  long h_new;  
  WORD         bfType;   
  DWORD       bfSize;   
  WORD         bfReserved1;   
  WORD         bfReserved2;   
  DWORD       bfOffBits;  
  float a[4],c[4],bRed[16],bGreen[16],bBlue[16];
  RGBTRIPLE * rgb;
  FILE *fp;
  FILE *fpoutdat;
  char k[100]="4.bmp";
char sopen[100],ssave[100],ssavedir[100];
sprintf(sopen,".\\待测图片\\%s",k);
    fp=fopen(sopen,"rb");  if(fp==NULL)           
  {
  printf("Can't open the file test.bmp!\n");
  exit(0);
  }
    fread(&bfType,sizeof(WORD),1,fp);
fread(&bfSize,sizeof(DWORD),1,fp);   
fread(&bfReserved1,sizeof(WORD),1,fp);   
fread(&bfReserved2,sizeof(WORD),1,fp);   
fread(&bfOffBits,sizeof(DWORD),1,fp);   
  fread(&bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);  /*获取位图信息头*/
  
  w_old=bmiHeader.biWidth;
  h_old=bmiHeader.biHeight;
  if(w_old%4!=0)
w_old=w_old+(4-w_old%4); //修正位图宽度值  
DWORD size=w_old*bmiHeader.biBitCount/8*h_old;     //m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(w_old*h_old*3)); 
  m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size)); 
  fread(m_ImageData,sizeof(BYTE)*(size),1,fp);  /*将rgb数据读入到m_ImageData中*/
  fclose(fp);  
  /*对新的bmp数据进行改变*/
   w_new=w_old*zoom;
   h_new=h_old*zoom;
   
   if(w_new%4!=0)
w_new=w_new+(4-w_new%4); //修正位图宽度值  
DWORD size1=w_new*bmiHeader.biBitCount/8*h_new;  
  /*按照三次卷积进行变化*/
  /*三次卷积公式:f(i+u,j+v)=a*b*c,其中a、c分别为与u、v有关的系数矩阵,b存储了与目的像素相关的原始像素*/
   rgb=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size1));/*开辟新的bmp图象rgb数据存储区域*/    
    for(y_new=0;y_new<h_new;y_new++)
{
for(x_new=0;x_new<w_new;x_new++)
{
x_old=(long)(x_new*num);
y_old=(long)(y_new*num);
x_oldf=x_new*num;
y_oldf=y_new*num;
            u=(float)(x_oldf-x_old);
v=(float)(y_oldf-y_old);
for(i=3;i>=0;i--)
a[i]=s(u-i+1); for(i=3;i>=0;i--)
c[i]=s(v-i+1);    /*计算系数矩阵*/ if((x_old>=0) && (x_old<w_old) && (y_old>=0) && (y_old<h_old))
{
          for(i=0;i<4;i++)
for(j=0;j<4;j++)  /*与目的像素相关的16个原始像素RGB*/
{if((j-1)<=0) 
{
  bBlue[i*4+j]=m_ImageData[0].rgbBlue;
  bGreen[i*4+j]=m_ImageData[0].rgbGreen;
  bRed[i*4+j]=m_ImageData[0].rgbRed;}
 else
 {
bBlue[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbBlue;
bGreen[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbGreen;
bRed[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbRed;
 }
}
                rgb[y_new*w_new+x_new].rgbBlue=(BYTE)ABC(a,bBlue,c);/*调用ABC求得目的像素*/
rgb[y_new*w_new+x_new].rgbGreen=(BYTE)ABC(a,bGreen,c);
                rgb[y_new*w_new+x_new].rgbRed=(BYTE)ABC(a,bRed,c);
     
} }
}
free(m_ImageData);
    m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size1));
for(i=0;i<w_new*h_new;i++)
{
   m_ImageData[i].rgbBlue=rgb[i].rgbBlue;
m_ImageData[i].rgbGreen=rgb[i].rgbGreen;
    m_ImageData[i].rgbRed=rgb[i].rgbRed;
}
bmiHeader.biWidth=w_new;
bmiHeader.biHeight=h_new;
  fpoutdat=fopen(".\\0.bmp","w+");  
  if(fpoutdat==NULL)
    {
      printf("Can't open the file test.dat!\n");
    }  fwrite(&bfType,sizeof(WORD),1,fpoutdat);
  fwrite(&bfSize,sizeof(DWORD),1,fpoutdat);   
  fwrite(&bfReserved1,sizeof(WORD),1,fpoutdat);   
  fwrite(&bfReserved2,sizeof(WORD),1,fpoutdat);   
  fwrite(&bfOffBits,sizeof(DWORD),1,fpoutdat);   
  fwrite(&bmiHeader,1,sizeof(bmiHeader),fpoutdat);
  fwrite(m_ImageData,1,sizeof(BYTE)*(size1),fpoutdat);
  fclose(fpoutdat);
  free(rgb);
  free(m_ImageData);
  
  printf("Change Successfully!");}float s(float x) /*S(x)是对 Sin(x*Pi)/x 的逼近(Pi是圆周率——π)*/
{
  if(abs(x)>=0&&abs(x)<1)
  return (1-2*abs(x)*abs(x)+abs(x)*abs(x)*abs(x));
   else
     if(abs(x)>=1&&abs(x)<2)
      return (4-8*abs(x)+5*abs(x)*abs(x)-abs(x)*abs(x)*abs(x));  else  
       return 0;
}float ABC(float a[],float b[],float c[]) /*求得像素值,内积*/
{
  int i,j,k;
  float abc=0;
  float tmp[4];
  for(i=0;i<4;i++)
    tmp[i]=0;
  for(k=0;k<4;k++)
    for(i=0;i<4;i++)
     for(j=0;j<4;j++)
      tmp[k]+=a[i]*b[i*4+j];
   for(i=0;i<4;i++)
    abc+=tmp[i]*c[i];
  return abc;  
}