Dalsa CProImage转CImage(MFC)

自己封装了一个函数,仅供参考

复制代码
void ToCImage(CProImage cProImage,CImage* cImage) //函数封装,注意指针传参
{
    CProImage cR,cG,cB;
    int width=cProImage.GetWidth();
    int height=cProImage.GetHeight();
    int channels;//通道

    if (cProImage.GetFormat()==CProData::FormatUByte)
    {
        channels=1;
    }else
    {
        channels=3; //彩色图需拆分后分别转换。
        cProImage.Split(&cR,&cG,&cB);
    }

    cImage->Create(width,height,8*channels);

    int pit=cImage->GetPitch();   //行与行的间距
    int bitCount=cImage->GetBPP()/8;

    BYTE* pImg=(BYTE*)cImage->GetBits(); //指向位图缓存

    for (int i=0;i<height;++i)
    {
        for (int j=0;j<width;++j)
        {
            if (channels==1)
            {
                *(pImg+pit*i+j*bitCount)=(int)cProImage.GetData(j,i);
            }
            if (channels==3) //注意BGR顺序
            {
                *(pImg+pit*i+j*bitCount)=(int)cB.GetData(j,i);
                *(pImg+pit*i+j*bitCount+1)=(int)cG.GetData(j,i);
                *(pImg+pit*i+j*bitCount+2)=(int)cR.GetData(j,i);
            }

        }
    }
    if (channels==1)
    {
        //CImage的数据其实是调色板的索引值,所以必须有调色板,否则全黑。注意彩色图不需要调色板
        RGBQUAD colors[256];
        cImage->GetColorTable(0, cImage->GetMaxColorTableEntries(), colors);
        for (int i = 0; i < 256; i++)
        {
            colors[i].rgbBlue = (BYTE)i;
            colors[i].rgbGreen = (BYTE)i;
            colors[i].rgbRed = (BYTE)i;
            colors[i].rgbReserved = 0; //为了压缩数据,使用24位表示一个像素,不保存透明值(alpha分量),所以使用rgbReserved。既然是保留不用的,设置成多少都可以。但是一般设置成0。
        }
        cImage->SetColorTable(0, cImage->GetMaxColorTableEntries(), colors);
    }
}
复制代码

 

posted @   夕西行  阅读(141)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示