将CImg数据结构转换为.Net位图类

时间:2017-09-25 18:29:41

标签: c# c++ cimg

我有一个C / C ++ dll用于生成一些信息,而且,这个信息中的图像,现在,我需要在C#中使用这个dll。 我已经实现了一个导出函数,它将所有CIMg :: data写入预先分配的缓冲区。 所以,我试图将这个预先分配的缓冲区转换为C#中的Bitmap,但是,生成的图像只有一些错误的行... 在此之后,我试图实现这个函数的替代版本,写入预先分配的缓冲区,来自图像的所有RGB,但是,当系统写入图像时,图像被镜像。

这是我保存所有RGB的功能:

std::vector<unsigned char> SystemImage::getData()
{
    if(!_generatedImage)
        this->createImage();

    std::vector<unsigned char> data;

    unsigned char red, blue, green;
    for (int x = 0; x < _baseImage->width(); x++)
    {
        for (int y = 0; y < _baseImage->height(); y++)
        {
            red = (*_baseImage)(y, x, 0, 0);
            green = (*_baseImage)(y, x, 0, 1);
            blue = (*_baseImage)(y, x, 0, 2);

            data.push_back(red);
            data.push_back(green);
            data.push_back(blue);
        }
    }

    return data;
} 

我的C#函数来处理这些信息:

    public Bitmap CreateImage()
    {
        const uint bufferSize = 6113880;
        byte[] data = new byte[bufferSize];

        Bridge.System_Bridge.getRGBData(PSystem, data, bufferSize);

        int position = 0;
        Bitmap bmp = new Bitmap(1332, 1530);
        for (int x = 0; x < 1332; x++)
            for (int y = 0; y < 1530; y++)
            {
                bmp.SetPixel(x, y, Color.FromArgb(data[position], data[position + 1], data[position + 2]));
                position += 3;
            }

        data = null;

        return bmp;
    }

还有更好的方法吗? 我如何使用CIMg :: Data来制作位图? (这会减少很多分配的内存!!)

0 个答案:

没有答案