我有一个C ++ / CLI dll,其中一个方法需要一个指针及其缓冲区大小作为参数。
// Example..
uint LoadImageFromMemory(const unsigned char * const BufferPtr, const int BufferSize);
Bitmap Img = Bitmap.FromFile(@"C:/my.jpg") as Bitmap;
.
.
// Convert the 'Img' to byte* pointer.
byte[] TempByte = new byte[TempStorage.Height * TempStorage.Width * 3];
byte[] ActualByte = null;
System.Drawing.Imaging.BitmapData m_pImageData = null;
// Converting Bitmap to Byte array...
try
{
m_pImageData = TempStorage.LockBits(new Rectangle(0, 0, TempStorage.Width, TempStorage.Height),
System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
System.IntPtr pScan = m_pImageData.Scan0; // 5
int nStride = m_pImageData.Stride;// 6
ActualByte = new byte[m_pImageData.Height * m_pImageData.Width * 3];
unsafe
{
byte* pBuffer = (byte*)(void*)pScan;// 7
int noffset = nStride - TempStorage.Width * 3;
int count = 0;
for (int nY = 0; nY < TempStorage.Height; nY++)
{
for (int nX = 0; nX < TempStorage.Width; nX++)
{
ActualByte[count] = pBuffer[0];
ActualByte[count + 1] = pBuffer[1];
ActualByte[count + 2] = pBuffer[2];
count += 3;
pBuffer += 3;
}
pBuffer += noffset;
}
}
}
finally
{
if (m_pImageData != null)
{
TempStorage.UnlockBits(m_pImageData);
}
}
.
.
// At the end...
.
.
fixed (byte* ptrAdd = ActualByte)
{
// this second parameter ( below ) is problematic...
rst = CppAPI.LoadImageFromMemory(ptrAdd, ?????);
}
如何获取缓冲区大小?
由于我不知道缓冲区大小到底意味着什么,我试图将这些值传递给第二个参数,即疯狂猜测。
不幸的是,它们都没有奏效。
我在C#中有图像,它的位图对象及其指针。这些不足以获得缓冲区大小吗?
答案 0 :(得分:1)
在我阅读肯·怀特提到的评论后,我想到的是,首先转换工作本身可能是错误的。
所以我摆脱了下面的代码
try
{
m_pImageData = TempStorage.LockBits(new Rectangle(0, 0, TempStorage.Width, TempStorage.Height),
System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
System.IntPtr pScan = m_pImageData.Scan0; // 5
int nStride = m_pImageData.Stride;// 6
ActualByte = new byte[m_pImageData.Height * m_pImageData.Width * 3];
unsafe
{
byte* pBuffer = (byte*)(void*)pScan;// 7
int noffset = nStride - TempStorage.Width * 3;
int count = 0;
for (int nY = 0; nY < TempStorage.Height; nY++)
{
for (int nX = 0; nX < TempStorage.Width; nX++)
{
ActualByte[count] = pBuffer[0];
ActualByte[count + 1] = pBuffer[1];
ActualByte[count + 2] = pBuffer[2];
count += 3;
pBuffer += 3;
}
pBuffer += noffset;
}
}
}
finally
{
if (m_pImageData != null)
{
TempStorage.UnlockBits(m_pImageData);
}
}
并决定使用MemoryStream
代替。
using (MemoryStream ms = new MemoryStream())
{
Img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ActualByte = ms.ToArray();
}
现在工作正常,第二个参数值应该是字节数组长度,正如Ken White在评论中所说。
// This should be...
CppAPI.LoadImageFromMemory(ptrAdd, ?????);
// Like this..
CppAPI.LoadImageFromMemory(ptrAdd, ActualByte.length);
答案 1 :(得分:0)
您将数组定义为字节数组,因此它与您定义的数组完全一样大。 m_pImageData.Height * m_pImageData.Width * 3
个字节长。