他年 2019-01-23 23:27 采纳率: 0%
浏览 1668

这个bmp的RGB转YUV,再用Y值输出灰度图为什么运行不出来?

谢谢诸位大佬,我觉得没什么毛病了啊……

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

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;

/* bmp文件头 */
#pragma pack(1)
typedef struct BMPFILEHEADER
{
    BYTE bfType;    //文件类型,必须是0x424D,即字符“BM”
    DWORD bSize;     // 文件的大小 
    WORD bReserved1; // 保留值,必须设置为0  
    WORD bReserved2; // 保留值,必须设置为0 
    DWORD bOffset;   // 文件头的最后到图像数据位开始的偏移量 
}BMPHeader;   
#pragma pack()
/* 位图数据信息结构*/
#pragma pack(1)
typedef struct BMP_INFO
{
    DWORD bInfoSize;            // 结构的大小   
    long bWidth;               // 图像的宽度     
    long bHeight;              // 图像的高度     
    WORD bPlanes;               // 图像的平面数  
    WORD bBitCount;             // 颜色/像素的位数 
    DWORD bCompression;         // 压缩类型 
    DWORD bmpImageSize;         // DIB数据区的大小,以字节为单位 
    long bXPelsPerMeter;       // 水平分辨率 
    long bYPelsPerMeter;       // 垂直分辨率 
    DWORD bClrUsed;             // 使用的色彩数 
    DWORD bClrImportant;        // 重要的颜色数 
}BMPInfo; 
#pragma pack()
/* 彩色表:调色板 */ 
#pragma pack(1)         
typedef struct RGB_QUAD 
{
    BYTE rgbBlue;     // 蓝色强度 
    BYTE rgbGreen;    // 绿色强度 
    BYTE rgbRed;      // 红色强度 
    BYTE rgbReversed; // 保留值 
}RGB;
#pragma pack()

int main()
{
    FILE *fp,*fg; 
    BMPHeader *fh;
    BMPInfo *fi;
    RGB *fq;     
    BYTE data[2000][2000][3];   //存储RGB图像的像素点
    BYTE yuv[2000][2000][3];    //yuv
    BYTE data_gray[2000];   //存储灰度图像的像素点

    int i,j,k;


    printf("%d",0);
    fp=fopen("test.bmp","rb");    //打开bmp文件 
    if (fp==NULL){  
      printf("Can't open the file!\n");  
      return 0;  
    }

    fh=(BMPHeader*)malloc(sizeof(BMPHeader));
    fi=(BMPInfo*)malloc(sizeof(BMPInfo));   //读取位图头结构和信息头
    fread(fh,sizeof(BMPHeader),1,fp);
    fread(fi,sizeof(BMPInfo),1,fp);   //修改头信息
    fi->bBitCount=8;
    fi->bmpImageSize=((fi->bWidth*3+3)/4)*4*fi->bHeight; 
     //fi->biClrUsed=256;
    fh->bOffset=sizeof(BMPHeader)+sizeof(BMPInfo)+256*sizeof(RGB);
    fh->bSize=fh->bOffset+fi->bmpImageSize;
    printf("%d",123);
    for(i=0;i<fi->bHeight;i++)       //读取RGB图像像素 
    {
        for(j=0;j<(fi->bWidth+3)/4*4;j++)
        {
            for(k=0;k<3;k++){
            fread(&data[i][j][k],1,1,fp);
            }
        }
    }

    /*rgb2yuv*/ 
    for(i=0;i<fi->bHeight;i++)        
    {
        for(j=0;j<(fi->bWidth+3)/4*4;j++)
        {
            yuv[i][j][0]=0.299*data[i][j][2]+0.587*data[i][j][1]+0.114*data[i][j][0];//Y
            yuv[i][j][1]=0.493*(data[i][j][2]-yuv[i][j][0]);//U
            yuv[i][j][2]=0.877*(data[i][j][2]-yuv[i][j][0]);//V
        }
    }

    /*创建灰色图像*/
    fg=fopen("gray.bmp","wb");
    if(fg==NULL)
        printf("Wrong!(write a gray bmp)\n");
    //创建调色板
    fq=(RGB*)malloc(256*sizeof(RGB)); 
    for(i=0;i<256;i++)
    {
        fq[i].rgbBlue=fq[i].rgbGreen=fq[i].rgbRed=i;
        //fq[i].rgbReversed=0;
    }
    fwrite(fh,sizeof(BMPHeader),1,fg);  //将头信息写入 
    fwrite(fi,sizeof(BMPInfo),1,fg);
    fwrite(fq,sizeof(RGB),256,fg);
    for(i=0;i<fi->bHeight;i++){   //读取yuv中的Y值并写入灰度图     
        for(j=0;j<(fi->bWidth+3)/4*4;j++){
                data_gray[j]=(int)yuv[i][j][0];              
        } 
        fwrite(data_gray,j,1,fg);
    }


    free(fh);
    free(fi);
    free(fq);
    fclose(fp);
    fclose(fg);

    return 0;
}
  • 写回答

1条回答

  • devmiao 2019-01-23 23:56
    关注
    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站