扫描行所占的字节数计算公式

时间:2023-01-10 07:34:38

( biWidth*biBitCount+31)/32*4  或  ((width * depth + 31) >> 5) << 2            

                                                                     一个扫描行所占的字节数

biWidth                                                        是图像的宽度以像素为单位

biBitCount                                                   是每个像素的位数


1.数字图像处理,BMP图像操作( biWidth*biBitCount+31)/32*4

http://blog.csdn.net/lscan/article/details/14647979

准备知识:

:"位(bit)"是电子计算机中最小的数据单位。每一位的状态只能是0或1,是计算机处理、存储、传输数据时使用的二进制格式。

字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。

像素:

位图的一个像素值所占的字节数:

当biBitCount=1时,8个像素占1个字节;

当biBitCount=4时,2个像素占1个字节;

当biBitCount=8时,1个像素占1个字节;

当biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像。

即:1个像素所占的字节数是biBitCount/8

解决:

 

Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足的以0填充,图像文件中一个扫描行所占的字节数计算方法:

( biWidth*biBitCount+31)/32*4               一个扫描行所占的字节数

biWidth                                                        是图像的宽度以像素为单位,

biBitCount                                                   是每个像素的位数,

biWidth*biBitCount                                    是一行所占的位数

( biWidth*biBitCount+31)                          把不满4字节的补满,使最终结果得出来的位数只会比原来的多(结尾有余数,不满4字节),或者不变(刚好以4个字节(32位)结束)

( biWidth*biBitCount+31)/32                    分成一块块4字节(32位)

( biWidth*biBitCount+31)/32*4                前面对齐4字节结束。得出字节总和

2.Capturing an Image

https://msdn.microsoft.com/en-us/library/windows/desktop/dd183402%28v=vs.85%29.aspx

DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;

3.QT qimage.cpp


const int bytes_per_line = ((width * depth + 31) >> 5) << 2; // bytes per scanline (must be multiple of 4)

QImageData * QImageData::create(const QSize &size, QImage::Format format)
{
    if (!size.isValid() || format == QImage::Format_Invalid)
        return 0;                                // invalid parameter(s)

    uint width = size.width();
    uint height = size.height();
    uint depth = qt_depthForFormat(format);

    const int bytes_per_line = ((width * depth + 31) >> 5) << 2; // bytes per scanline (must be multiple of 4)

    // sanity check for potential overflows
    if (INT_MAX/depth < width
        || bytes_per_line <= 0
        || height <= 0
        || INT_MAX/uint(bytes_per_line) < height
        || INT_MAX/sizeof(uchar *) < uint(height))
        return 0;

    QScopedPointer<QImageData> d(new QImageData);

    switch (format) {
    case QImage::Format_Mono:
    case QImage::Format_MonoLSB:
        d->colortable.resize(2);
        d->colortable[0] = QColor(Qt::black).rgba();
        d->colortable[1] = QColor(Qt::white).rgba();
        break;
    default:
        break;
    }

    d->width = width;
    d->height = height;
    d->depth = depth;
    d->format = format;
    d->has_alpha_clut = false;
    d->is_cached = false;

    d->bytes_per_line = bytes_per_line;

    d->nbytes = d->bytes_per_line*height;
    d->data  = (uchar *)malloc(d->nbytes);

    if (!d->data) {
        return 0;
    }

    d->ref.ref();
    return d.take();

}