对bmp文件读写遇到的小问题


先把代码放上来,算是个记录吧。
//main.cpp
--------------------------------------------------------------------------------------------------------------------
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "rgb.h"
#include <windows.h>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER infoHeader;

    QFile testBmp("test.bmp");
    QFile outBmp("out.bmp");
    testBmp.open(QIODevice::ReadOnly);
    testBmp.read((char*)&fileHeader,sizeof(BITMAPFILEHEADER));
    testBmp.read((char*)&infoHeader,sizeof(BITMAPINFOHEADER));
    if(infoHeader.biBitCount == 24)
    {
        int infoSize = infoHeader.biHeight*infoHeader.biWidth*sizeof(RGB);
        int fillSize = fileHeader.bfSize-infoSize-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER);
        RGB img[infoHeader.biHeight][infoHeader.biWidth];
        testBmp.read((char*)img,infoSize);
        char fillByte[fillSize];
        testBmp.read(fillByte,fillSize);

        for(int i=0;i<infoHeader.biWidth;i++)
        {
            img[50][i].r = 0;
            img[50][i].g = 0;
            img[50][i].b = 0;
        }

        outBmp.open(QIODevice::WriteOnly);
        outBmp.write((char*)&fileHeader,sizeof(BITMAPFILEHEADER));
        outBmp.write((char*)&infoHeader,sizeof(BITMAPINFOHEADER));
        outBmp.write((char*)img,infoSize);
        outBmp.write(fillByte,fillSize);
        outBmp.close();
    }
    testBmp.close();
    
    return a.exec();
}



//rgb.h
--------------------------------------------------------------------------------------------------------------------
#ifndef RGB_H
#define RGB_H

class RGB
{
public:
    RGB();
    unsigned char r;
    unsigned char b;
    unsigned char g;
};

#endif // RGB_H



第一次对图像进行读写,这里的代码是想做个试验。在第50行画条线。
问题来了,生成的图像是下面这样的:
对bmp文件读写遇到的小问题 - e易 - E的博客

仔细看右边就会发现,黑线偏移了一个像素。
放大图:
对bmp文件读写遇到的小问题 - e易 - E的博客

这里看得很清楚,画出来的黑线有一个像素变成了棕色,接下来一个像素向下偏移了一像素,并且是蓝色。

//原因还不知道,先记录下问题。

已经找到问题的原因了。
算是我对bmp储存结构的理解有问题。
在前面的blog中已经对bmp格式的数据结构有了详细介绍。(http://eflash.blog.163.com/blog/static/120726908201331610920605/)
位图按行存贮,位图的宽度不等于位图的行字节数。每个像素占用 biBitCount/8 个字节,且每行占用的字节数必须是4字节的整数倍! 不是4字节的整数倍时要进行填充。
注意:要对每一行都进行填充,填充的字节跟在每一行的后面! 一开始我就是这里理解错了。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值