zoukankan      html  css  js  c++  java
  • CImage类提供了GetBits()函数原理及实现

    CImage类提供了GetBits()函数来读取数据区,GetBits()函数返回的是图片最后一行第一个像素的地址,
    网上有人说返回指针的起始位置是不同的,有些图片返回的是左上角像素的地址,有些是左下角像素的地址,跟图片内部顺序有关。
    GetPitch( ) 图像的间距。 如果返回值为负,位图是一个从下到上 DIB,并且原点是左下角。 如果返回值为正的,位图是一组 DIB,并且原点为左上角
    两个函数GetPitch()和GetHeight()一起使用就可以得到图片数据取得起始位置

    img_Data=(BYTE *)m_Image.GetBits()+(m_Image.GetPitch()*(m_Image.GetHeight()-1));

    这样,img_Data就是图片数据区的起始位置,这个公式是从codeproject里看到的,介绍的很精辟,可以从google里搜索到。
    其中GetHeight()函数返回图片的高度(以像素为单位)。GetPitch()返回图像的斜度,如果图像的顺序是从下到上(也就是GetBits()返回左上角像素的地址),
    这时GetPitch()返回一个负值,大小为图像宽所占有的字节数,例如24位800*600的图片,返回值应该是正或负的800*3。
    这样用每一行的字节数乘行数就可以得到起始位置了。

    函数getbits(x,p,n),返回x中从右边数第p位开始向右数n位的字段。

    这里假设最右边的一位是第0位,n与p都是合理的正值。

    例如getbits(x,4,3)返回x中的第4、3、2三位的值。

    下面给出通过位运算的实现方法:

    unsigned getbits(unsigned x,int p,int n)
    {
       return (x>>(p+1-n))&~(~0<<n);
    }


    其中,表达式x>>(p+1-n)将期望获得的字段移动到字的最右端,~0的所有位都为1,

    这里使用语句~0<<n将~0左移n位,并将最右边的n位用0填补。再使用~运算符对它

    按位取反,这样就建立了最右边n位全为1的屏蔽码。

  • 相关阅读:
    DBA-常用到的动态视图分析语句
    SQL Server 复制(Replication) ——事务复制搭建
    SQL Server 不同网段IP通过名称访问
    [javaEE] HTTP协议总结
    [android] 从gallery获取图片
    [android] 加载大图片到内存
    [javaEE] web应用的目录结构&配置虚拟主机
    [android] 代码注册广播接收者&利用广播调用服务的方法
    [android] 采用aidl绑定远程服务
    [Linux] Linux的环境变量
  • 原文地址:https://www.cnblogs.com/wxl845235800/p/7523554.html
Copyright © 2011-2022 走看看