CImage 直接内存操作

骨气奇高2023-04-24  26

24位的 位图是最简单的位图格式,因为它没有调色板,所有的颜色值直接存储在该颜色位置上(比如(0,0)位置上是0xFFFFFF 白色),而其他格式 存在调色板,每一个颜色位置上存储的是响应的偏移,所以必须先通过位置读出偏移然后在到条色板上定位颜色,才可以找到相应的颜色值,原理懂了代码就不难了!

    CRect rc;

    GetClientRect(rc);

    CImage image;

    imageLoad(_T("c:\\1jpg")); //文件路径

    if (imageGetBPP() == 32)

    {

        int i; int j; 

        for (i = 0; i < imageGetWidth(); i++)

        {

            for (j = 0; j < imageGetHeight(); j++)

            {

                byte pByte = (byte )imageGetPixelAddress(i, j);

                pByte[0] = pByte[0]  pByte[3] / 255;

                pByte[1] = pByte[1]  pByte[3] / 255;

                pByte[2] = pByte[2]  pByte[3] / 255;

            }

        }

    }

    imageDraw(GetDC()->m_hDC, rc); //dc,rc 可换成控件的,试试

哪有那么复杂,只要用CImage的PlgBlt方法就可以解决90度,180度和反转的问题。

例:

CImage m_pCurrentFrame;

CPoint m_DisplayPoints[3]; // 放着旋转后的四边形的3个顶点 如果逆时针旋转90度

// m_DisplayPoints[0] 右上角,m_DisplayPoints[1] 左上角

// m_DisplayPoints[3] 右下角

int width,height; // 源图的宽和高

m_pCurrentFrame->PlgBlt(dc,m_DisplayPoints,0,0,width,height); // m_pCurrentFrame 转90度

CImage用了GdiPlus的,是不是差什么初始化操作?

每次都返回E_FAIL么,未知错误?

----

CImage是可以调试源码的,跟踪一下看看吧,是不是GDIPLUS初始化失败了。

CImage::Create()

CreateEx()这两个函数可以满足你的要求。

BOOL CreateEx(

int nWidth,

int nHeight,

int nBPP,

DWORD eCompression,

const DWORD pdwBitmasks = NULL,

DWORD dwFlags = 0

) throw( );

BOOL Create(

int nWidth,

int nHeight,

int nBPP,

DWORD dwFlags = 0

) throw( );

上面是这二个函数的原型,你在使用的时候把参数nBPP设置为1即是二值图像。

CImage是atl类。存在于比较新的VC版本中(vc6中无)。

以上就是关于CImage 直接内存操作全部的内容,包括:CImage 直接内存操作、vs2010中CBitmap静态图片控件只能显示出在资源中的位图,如何使用CImage类使控件支持jpg等其他格式图片、CImage图像旋转问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

转载请注明原文地址:https://juke.outofmemory.cn/read/3656718.html

最新回复(0)