有关c语言图像处理的图片大小的问题

时间:2021-05-13 17:37:59
#define ROW 240和#define COL 320来定义图片的大小,为什么把240和320改成其他的数字后,处理不同大小的图片就不行了呢?是什么原因呢?代码如下:
/*main.c*/  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <malloc.h>  
#include <ctype.h>  
#include <process.h>  
  
#include "BMP.h"  
#define bool unsigned char  
#define true 1  
#define false 0  
  
BITMAPFILEHEADER bmfh;  
BITMAPINFOHEADER bmih;
RGBQUAD RGB;  
BYTE *imgData;  
bool bReadBMFH = false;  
bool bReadBMIH = false;  
bool bReadPixel = false;  

#define ROW 240
#define COL 320

void ShowImage(char * filename)
 {
         char cmd[266];
 
        strcpy(cmd,"start ");
         strcat(cmd,filename);
         printf("%s\n",cmd);
         system(cmd);
 }

int ReadFileHeader(char *filepath,BITMAPFILEHEADER *bmfh)  
{  
    FILE *fp;  
    fp = fopen(filepath,"rb");  
    if(!fp)  
    {  
        printf("Can not open the file:%s\n",filepath);  
        return -1;  
    }  
    if(fread(&bmfh->bfType, sizeof(WORD),1,fp) != 1)  
    {  
        printf("Can not read bfType in the file header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmfh->bfSize,sizeof(DWORD),1,fp) != 1)  
    {  
        printf("Can not read bfSize in the file header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmfh->bfReserved1,sizeof(WORD),1,fp) != 1)  
    {  
        printf("Can not read bfReserved1 in the file header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmfh->bfReserved2,sizeof(WORD),1,fp) != 1)  
    {  
       printf("Can not read bfReserved2 in the file header.\n");  
        fclose(fp);  
        return -1;  
    }     
    if(fread(&bmfh->bfOffBits,sizeof(DWORD),1,fp) != 1)  
    {  
        printf("Can not read bfOffBits in the file header.\n");  
        fclose(fp);  
        return -1;  
    }  
    fclose(fp);  
    return 0;  
}  
 

int ReadInfoHeader(char *filepath, BITMAPINFOHEADER *bmih)  
{  
    FILE *fp;  
    fp = fopen(filepath, "rb");  
    if(!fp)  
    {  
        printf("Can not open the file:%s\n",filepath);  
        return -1;  
    }  
    fseek(fp,14,SEEK_SET);  
    if(fread(&bmih->biSize,sizeof(DWORD),1,fp) != 1)  
    {  
        printf("Can not read biSize in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
  
    if(fread(&bmih->biWidth,sizeof(LONG),1,fp) != 1)  
    {  
        printf("Can not read biWidth in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmih->biHeight,sizeof(LONG),1,fp) != 1)  
    {  
        printf("Can not read biHeight in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmih->biPlanes,sizeof(WORD),1,fp) != 1)  
    {  
        printf("Can not read biPlanes in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmih->biBitCount,sizeof(WORD),1,fp) != 1)  
    {  
        printf("Can not read biBitCount in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmih->biCompression,sizeof(DWORD),1,fp)!=1)  
    {     
        printf("Can not read biCompression in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmih->biSizeImage,sizeof(DWORD),1,fp)!=1)  
    {  
        printf("Can not read biSizeImage in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
    if(fread(&bmih->biXPelsPerMeter,sizeof(LONG),1,fp)!=1)  
    {  
        printf("Can not read biXPelsPerMeter in the info header.\n");  
        fclose(fp);  
        return -1;  
    }         
    if(fread(&bmih->biYPelsPerMeter,sizeof(LONG),1,fp)!=1)  
    {  
        printf("Can not read biYPelsPerMeter in the info header.\n");  
        fclose(fp);  
        return -1;  
    }     
    if(fread(&bmih->biClrUsed,sizeof(DWORD),1,fp)!=1)  
    {     
       printf("Can not read biClrUsed in the info header.\n");  
       fclose(fp);  
    return -1;  
    }  
    if(fread(&bmih->biClrImportant,sizeof(DWORD),1,fp)!=1)  
    {  
        printf("Can not read biClrImportant in the info header.\n");  
        fclose(fp);  
        return -1;  
    }  
    fclose(fp);  
    return 0;  
}




LONG GetLineBytes(int imgWidth,int bitCount)  
{  
    return (imgWidth*bitCount+31)/32*4;  

 


int ReadPixelData(char *filepath,BYTE *imgData)  
{  
    BITMAPFILEHEADER  bmfh;  
    BITMAPINFOHEADER  bmih;  
    BYTE *data;  
    FILE *fp;  
    int n;  
    int width;  
    int height;  
    int bitCount;  
    DWORD dwLineBytes;  
    n = ReadFileHeader(filepath,&bmfh);  
    if(n == -1)  
    {  
        printf("Can not read the file header of the BMP file.\n");  
        return -1;  
    }  
  
    n = ReadInfoHeader(filepath,&bmih);  
    if(n == -1)  
    {  
        printf("Can not read the info header of the BMP file.\n");  
        return -1;  
     }  
    width = bmih.biWidth;  
    height = bmih.biHeight;  
    bitCount = bmih.biBitCount;  
    dwLineBytes = GetLineBytes(width, bitCount);  
    if(_msize(imgData) != (dwLineBytes * height))  
    {  
        printf("The size you allocate for the pixel data is not right.\n");  
        printf("Fittable size:%ldbytes.\n",(dwLineBytes*height));  
        printf("Your size :%ld bytes.\n",sizeof(imgData));  
        return -1;  
    }  
    data = (BYTE *)malloc(dwLineBytes*height*sizeof(BYTE));  
    if(!data)  
    {  
        printf("Can allocate memory for pixel data.\n");  
        return -1;  
    }  
    fp = fopen(filepath,"rb");  
    if(!fp)  
    {  
        printf("Can not oprn the file :%s.\n",filepath);  
       free(data);  
        return -1;  
    }  
  
    if(bitCount == 8 || bitCount == 24)  
    {  
        fseek(fp,bmfh.bfOffBits,SEEK_SET);  
    }  
    else  
    {  
        printf("Only Support:8 or 24 bits.\n");  
        free(data);  
        fclose(fp);  
        return -1;  
    }  
    n = fread(data,dwLineBytes*height*sizeof(BYTE),1,fp);  
    if(n == 0)  
    {  
        if(feof(fp))  
        {}  
        if(ferror(fp))  
        {  
            printf("Can not read the pixel data.\n");  
            free(data);  
            fclose(fp);  
            return -1;  
        }  
    }  
    memcpy(imgData,data,dwLineBytes*height*sizeof(BYTE));  
    free(data);  
    fclose(fp);  
  
    return 0;  
}




void PrintPixelData(BYTE *imgData,int width,int height,int bitCount)
 {
         int i;
         int j;
         int p;
         DWORD dwLineBytes;
         dwLineBytes=GetLineBytes(width,bitCount);
 
        if(bitCount==8)
         {
             for(i=0;i<height;i++)
                 {
                     for(j=0;j<width;j++)
                         {
                      p=*(imgData+dwLineBytes*(height-1-i)+j);
                      printf("%d,",p);
                         }
                     printf("\n");
                 }
         }
}
void SavePixelData_matrix(BYTE *imgData,int width,int height,int bitCount,int a[ROW][COL],int c)
 {
     int i;
     int j;
     int p;
     DWORD dwLineBytes;
     c=COL;
 dwLineBytes = GetLineBytes(width, bitCount);
 if(bitCount==8)
      for(i=0;i<height;i++)
     {
         for(j=0;j<width;j++)
          {
               p=*(imgData+dwLineBytes*(height-1-i)+j);
               a[i][j]=p;
          }
     }
         
 }


int main()
{
FILE *fp;
char filepath[256];
int i,j;
float m,n,d;
int x1=0,x2=0;
int k1=0,k2=0;
int sum1=0,sum2=0;
int a[ROW][COL],b[COL],c[COL];
int width;  
    int height;  
    int bitCount;
DWORD dwLineBytes;
printf("Input the path of the BMP file:\n");  
    gets(filepath);
fp = fopen(filepath,"r");  
        if(!fp)  
        {  
            printf("Error: The path is not correct.\n");  
            return -1;  
        } 


//读文件头
    i = ReadFileHeader(filepath,&bmfh);  
    if(i != -1)  
    {  
         printf("Read the file header successfully.\n");  
         bReadBMFH = true;  
               
    }  
    else  
    {  
        printf("Read the file header failed\n");  
        bReadBMFH = false;  
    }  


//读文件信息头
 i = ReadInfoHeader(filepath, &bmih);  
     if( i != -1)  
     {  
          printf("Read the info header successfully\n");  
          bReadBMIH = true;  
            
     }  
     else  
     {  
          printf("Read the info header failie\n");  
          bReadBMIH = false;  
 }


//读入图像像素
width = bmih.biWidth;  
    height = bmih.biHeight;  
    bitCount = bmih.biBitCount;
dwLineBytes = GetLineBytes(width,bitCount);  
imgData = (BYTE*)malloc(dwLineBytes*height*sizeof(BYTE));
if(!imgData)  
    {  
        printf("Can not allocate memory for the image.\n");   
    }  
    i = ReadPixelData(filepath,imgData);  
    if(i == -1)  
    {  
        printf("Read the pixel data failed.\n");  
        bReadPixel = false;   
    }  
    else  
    {  
        printf("Read the pixel data successfully.\n");  
        bReadPixel = true;  
    }

//将像素值保存到矩阵a
SavePixelData_matrix(imgData,width,height,bitCount,a,COL);
    printf("width=%d,height=%d,bitCount=%d\n",width,height,bitCount,a,COL);
//量块上的点拟合直线
for(i=0;i<height;i++)
for(j=0;j<190;j++)
{
if(a[i][j]!=0)
{
b[x1]=j;
x1=x1+1;
}
}
     
 for(j=0;j<x1;j++)
{sum1=sum1+b[j];}
    printf("sum1=%d\n",sum1);
printf("x1=%d\n",x1);
    m = (((float)sum1)/x1);
printf("k1=%.4f\n",m);

//for(i=0;i<x1;i++)
// { printf("%d ",b[i]);}
//得到拟合直线的横坐标
for(i=0;i<height;i++)
for(j=190;j<width;j++)
{
if(a[i][j]!=0)
{
c[x2]=j;
x2=x2+1;
}
}
//for(i=0;i<x2;i++)
//{ printf("%d ",c[i]);}
for(j=0;j<x2;j++)
{sum2=sum2+c[j];}
printf("sum2=%d\n",sum2);
printf("x2=%d\n ",x2);
n = (((float)sum2)/x2);
        printf("k2=%.4f\n",n);

//算距离
    d=n-m;
printf("量块厚度所占像素个数=%.4f ",d);

fclose(fp);
}
求高手指点下

13 个解决方案

#1


bmp.h是:
/*BMP.h*/  
#ifndef BMP_H_INCLUDED  
#define BMP_H_INCLUDED  
  
typedef unsigned short WORD;  
typedef unsigned long DWORD;  
typedef long LONG;  
typedef unsigned char BYTE;  
  
typedef struct tagBITMAPFILEHEADER  
{  
    WORD bfType;  
    DWORD bfSize;  
    WORD bfReserved1;  
    WORD bfReserved2;  
    DWORD bfOffBits;  
}BITMAPFILEHEADER;  
  
typedef struct tagBITMAPINFOHEADER  
{  
    DWORD biSize;  
    LONG biWidth;  
    LONG biHeight;  
    WORD biPlanes;  
    WORD biBitCount;  
    DWORD biCompression;  
    DWORD biSizeImage;  
    LONG biXPelsPerMeter;  
    LONG biYPelsPerMeter;  
    DWORD biClrUsed;  
    DWORD biClrImportant;  
}BITMAPINFOHEADER;  
  
typedef struct tagRGBQUAD  
{  
    BYTE rgbBlue;  
    BYTE rgbGreen;  
    BYTE rgbRed;  
    BYTE rgbReserved;  
}RGBQUAD;  
  
typedef struct tagBITMAPINFO  
{  
    BITMAPINFOHEADER bmiHeader;  
    RGBQUAD bmiColors[1];  
}BITMAPINFO;  
  
#endif  

#2


自己顶,求高手指点下!!

#3


只有单步调试看看。

#4


引用 3 楼 turingo 的回复:
只有单步调试看看。
我的ROW 和COL改了编译时没有错的,只是不出来Input the path of the BMP file:没法输入路径,而是出来Press any key to continue,这是为什么啊?

#5


直接写入图片文件名调试看看。

引用 4 楼 jinmengjue1989 的回复:
Quote: 引用 3 楼 turingo 的回复:

只有单步调试看看。
我的ROW 和COL改了编译时没有错的,只是不出来Input the path of the BMP file:没法输入路径,而是出来Press any key to continue,这是为什么啊?

#6


我用楼主的代码在我的电脑上编了一下,没有楼主所说的现象啊

#7


引用 5 楼 turingo 的回复:
直接写入图片文件名调试看看。

Quote: 引用 4 楼 jinmengjue1989 的回复:

Quote: 引用 3 楼 turingo 的回复:

只有单步调试看看。
我的ROW 和COL改了编译时没有错的,只是不出来Input the path of the BMP file:没法输入路径,而是出来Press any key to continue,这是为什么啊?
直接写是可以的,但是写路径这样就是不行了,把ROW和COL改成比240和320小的就运行正常,要是改大了,就是不行,按理说这就是定义了数组的大小啊?为什么不可以呢?

#8


320 是 32 的整数倍,任何因为“位图数据对齐,而产生的问题”,都不存在;

解决这个问题的方案,就是修改 “位图数据对齐,没有正确处理”的错误;
使得任何宽度的位图,都不会有对齐错位的问题。

#9


引用 8 楼 lm_whales 的回复:
320 是 32 的整数倍,任何因为“位图数据对齐,而产生的问题”,都不存在;

解决这个问题的方案,就是修改 “位图数据对齐,没有正确处理”的错误;
使得任何宽度的位图,都不会有对齐错位的问题。
但是我改成其他的32的倍数也是不行的啊?比如:480*640,这是为什么啊?求指点!

#10


main()里面有个魔数 190 
把这个190 的来历搞清楚,也许就解决了。

#11


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。

#12


参考MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\MANDEL\*.*

#13


 看楼主的意思,printf("Input the path of the BMP file:\n");  
这个没有打出来。可能是楼主本地编译器对堆栈大小有限制。
a[ROW][COL]这个栈数据过大超出编译器的允许最大限制程序加载不起来。
试试改改编译器的设置

#1


bmp.h是:
/*BMP.h*/  
#ifndef BMP_H_INCLUDED  
#define BMP_H_INCLUDED  
  
typedef unsigned short WORD;  
typedef unsigned long DWORD;  
typedef long LONG;  
typedef unsigned char BYTE;  
  
typedef struct tagBITMAPFILEHEADER  
{  
    WORD bfType;  
    DWORD bfSize;  
    WORD bfReserved1;  
    WORD bfReserved2;  
    DWORD bfOffBits;  
}BITMAPFILEHEADER;  
  
typedef struct tagBITMAPINFOHEADER  
{  
    DWORD biSize;  
    LONG biWidth;  
    LONG biHeight;  
    WORD biPlanes;  
    WORD biBitCount;  
    DWORD biCompression;  
    DWORD biSizeImage;  
    LONG biXPelsPerMeter;  
    LONG biYPelsPerMeter;  
    DWORD biClrUsed;  
    DWORD biClrImportant;  
}BITMAPINFOHEADER;  
  
typedef struct tagRGBQUAD  
{  
    BYTE rgbBlue;  
    BYTE rgbGreen;  
    BYTE rgbRed;  
    BYTE rgbReserved;  
}RGBQUAD;  
  
typedef struct tagBITMAPINFO  
{  
    BITMAPINFOHEADER bmiHeader;  
    RGBQUAD bmiColors[1];  
}BITMAPINFO;  
  
#endif  

#2


自己顶,求高手指点下!!

#3


只有单步调试看看。

#4


引用 3 楼 turingo 的回复:
只有单步调试看看。
我的ROW 和COL改了编译时没有错的,只是不出来Input the path of the BMP file:没法输入路径,而是出来Press any key to continue,这是为什么啊?

#5


直接写入图片文件名调试看看。

引用 4 楼 jinmengjue1989 的回复:
Quote: 引用 3 楼 turingo 的回复:

只有单步调试看看。
我的ROW 和COL改了编译时没有错的,只是不出来Input the path of the BMP file:没法输入路径,而是出来Press any key to continue,这是为什么啊?

#6


我用楼主的代码在我的电脑上编了一下,没有楼主所说的现象啊

#7


引用 5 楼 turingo 的回复:
直接写入图片文件名调试看看。

Quote: 引用 4 楼 jinmengjue1989 的回复:

Quote: 引用 3 楼 turingo 的回复:

只有单步调试看看。
我的ROW 和COL改了编译时没有错的,只是不出来Input the path of the BMP file:没法输入路径,而是出来Press any key to continue,这是为什么啊?
直接写是可以的,但是写路径这样就是不行了,把ROW和COL改成比240和320小的就运行正常,要是改大了,就是不行,按理说这就是定义了数组的大小啊?为什么不可以呢?

#8


320 是 32 的整数倍,任何因为“位图数据对齐,而产生的问题”,都不存在;

解决这个问题的方案,就是修改 “位图数据对齐,没有正确处理”的错误;
使得任何宽度的位图,都不会有对齐错位的问题。

#9


引用 8 楼 lm_whales 的回复:
320 是 32 的整数倍,任何因为“位图数据对齐,而产生的问题”,都不存在;

解决这个问题的方案,就是修改 “位图数据对齐,没有正确处理”的错误;
使得任何宽度的位图,都不会有对齐错位的问题。
但是我改成其他的32的倍数也是不行的啊?比如:480*640,这是为什么啊?求指点!

#10


main()里面有个魔数 190 
把这个190 的来历搞清楚,也许就解决了。

#11


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。

#12


参考MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\MANDEL\*.*

#13


 看楼主的意思,printf("Input the path of the BMP file:\n");  
这个没有打出来。可能是楼主本地编译器对堆栈大小有限制。
a[ROW][COL]这个栈数据过大超出编译器的允许最大限制程序加载不起来。
试试改改编译器的设置