zoukankan      html  css  js  c++  java
  • (biwidth*biBitCount/8+3)/4*4

    转自:http://wenda.tianya.cn/question/510127906cc5c480

    在VC++中,读入BMP图像必须把每行所占的字节数转换为4的倍数,用了这个公式(biwidth*biBitCount/8+3)/4*4,不明白其含义

    注意:C语言的除法里,两个int相除,结果会被CUT掉——只取商而不取余数。
    biwidth*biBitCount/8 好理解,就是一个扫描行的字节数(如:100 * 24/8,即100 * 3 ,有100个像素,每个像素有3个字节,所以每行总字节数为300)
    记 b = biwidth*biBitCount/8,  那么, 原式 =(b+3)/4*4,
    情况一,b是四的倍数,(b+3)/4*4 == (b/4*4 + 3/4*4) == b + 0 == b

    (如上:300是4的倍数,所以(300+3)/4*4 == (300/4*4)+3/4*4 == 75*4+(3/4*4)(因C程序里两个int相除,只取整数所以3/4*4等于0 ),即结果为300 Bytes


    情况二,b不是四的倍数
      另 b = 4x+n,其中4x就是x的4倍数,n就是那个余数。
      容易得知:1 <= n <= 3,   4 <= n+3 <= 6,
        于是,原式 ==  (4x+n + 3)/4*4, (其中x是任意值),
                           ==  (4x/4*4 + (n+3)/4*4)
        在C语言中  ==   4x + 4  == (x+1)*4
    例如:
    1. (16)/4*4 == 16, 
    2. (18+3)/4*4 == (16+2+3)/4*4 == (16 + 5)/4*4 == (4+1)*4 == 20

       (33+3)/4*4 == (32+1+3)/4*4 == (32 + 4)/4*4 == (8+1)*4 == 36
       (34+3)/4*4 == (32+2+3)/4*4 == (32 + 5)/4*4 == (8+1)*4 == 36
       (35+3)/4*4 == (32+3+3)/4*4 == (32 + 6)/4*4 == (8+1)*4 == 36

  • 相关阅读:
    端模板引擎
    Orcale Function Sequence
    OData 集成
    validate[.unobtrusive]和Bootstrap实现tooltip错误提示
    Django
    Web Api 控制器
    HelloWorld和数据绑定
    动态Web Api层
    用户管理
    Docker
  • 原文地址:https://www.cnblogs.com/pamxy/p/2991454.html
Copyright © 2011-2022 走看看