我有一个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来制作位图? (这会减少很多分配的内存!!)