.BMP文件无法打开 [英] .BMP file cannot be opened

查看:468
本文介绍了.BMP文件无法打开的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个bmp文件.该文件已创建,我可以打开它,但是它说该文件已损坏,无法正确打开.这是我保存文件的方式:

I'm trying to create a bmp file. The file is created and I can open it but it says, that the file is corrupt and cannot be opened propperly. Here is how i save the file:

void createBMP(char* pixelData, long xRes, long yRes){
BITMAPFILEHEADER fheader;
BITMAPINFOHEADER iheader;
COLORREF_RGB rgb;

//file header werte setzen
fheader.bfType = 0x4D42;
fheader.bfSize = sizeof(BITMAPFILEHEADER);
fheader.bfReserved1 =0;
fheader.bfReserved2=0;
fheader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

//info header werte setzen
iheader.biSize = sizeof(BITMAPINFOHEADER);
iheader.biWidth = xRes;
iheader.biHeight = yRes;
iheader.biPlanes = 1;
//farbtiefe
iheader.biBitCount = 24;
iheader.biCompression = 0;
iheader.biSizeImage = 0;
iheader.biXPelsPerMeter = 0;
iheader.biYPelsPerMeter = 0;
//anzahl der eintraege der farbtabelle
iheader.biClrUsed = 0;
iheader.biClrImportant = 0;

//rgbfarbwerte setzen
rgb.cRed = 0;
rgb.cGreen = 0;
rgb.cBlue = 0;

printf("\nwriting Image-File");

FILE *f;


f = fopen("testASP.bmp", "wb");


if(f == NULL){
    freopen("testASP.bmp", "wb", f);
   // printf("Fehler beim Laden des Files");
   // return;
}

printf("\nPath: %S\n");

fwrite(&fheader, sizeof(BITMAPFILEHEADER),1,f);
fwrite(&iheader, sizeof(BITMAPINFOHEADER),1,f);

int i,j;

for(i=0;i<xRes; i++){
    for(j=0;j<yRes;j++){
        fwrite(&rgb, sizeof(COLORREF_RGB),1,f);
    }
}

fclose(f);


printf("Bild wurde gespeichert\n");

我不确定自己在做什么错,请仔细检查这些值,但似乎找不到我的错误.帮助将不胜感激.谢谢

I'm notsure what I am doing wrong double checked the values but cannot seem to find my mistake. Help would be appreciated. Thanks

根据请求添加结构:

typedef unsigned int UINT;
typedef unsigned long DWORD;
typedef long int LONG;
typedef unsigned short WORD;
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 COLORREF_RGB
{
    BYTE cRed;
    BYTE cGreen;
    BYTE cBlue;
}COLORREF_RGB;

推荐答案

以下过程将创建一个黑色的BMP文件:

The following procedure creates a black BMP file:

// WIDTHBYTES takes # of bits in a scanline and rounds up to nearest word.
#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)

int makeBMPfile(int xRes, int yRes)
{
    BITMAPFILEHEADER fheader = {0};
    BITMAPINFOHEADER iheader = {0};
    COLORREF_RGB rgb = {0,0,0};
    FILE *fp;
    int i,j, padbytes;

    iheader.biSize      = sizeof (BITMAPINFOHEADER);
    iheader.biWidth     = xRes;
    iheader.biHeight    = yRes;
    iheader.biPlanes    = 1;
    iheader.biBitCount = 24;
    iheader.biSizeImage= WIDTHBYTES(xRes*24) * yRes;
    padbytes= WIDTHBYTES(xRes*24) - (xRes*24/8);

    fheader.bfType = 0x4D42;
    fheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + 0/*no palette for 24 bits color*/;
    fheader.bfSize = fheader.bfOffBits + iheader.biSizeImage;

    if ((fp = fopen("testASP.bmp", "wb"))==NULL) return(0);

    fwrite(&fheader, sizeof(BITMAPFILEHEADER),1,fp);
    fwrite(&iheader, sizeof(BITMAPINFOHEADER),1,fp);

    for(i=0;i<yRes; i++){
        for(j=0;j<xRes;j++){
            fwrite(&rgb, sizeof(COLORREF_RGB),1,fp);
        }
        if (padbytes) fwrite(&rgb, padbytes,1,fp);
    }
    fclose(fp);
    return(1);
}

这篇关于.BMP文件无法打开的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆