Я пишу приложение Winform для захвата изображений с камеры. Захваченные необработанные данные с камеры должны быть преобразованы в формат DNG. Производитель предоставил пример C ++, изображающий то же самое.
Я использовал ту же логику в C #, но изображение DNG, сгенерированное кодом C #, некорректно.
Я думаю, что в коде C # эквивалент "memcpy_s" не выполняется правильно, и поэтому он терпит неудачу.
Поскольку я не очень разбираюсь в C ++, я мог испортить логику в C #,
Любые указатели / предложения / ценные рекомендации будут очень полезны. Огромное спасибо за ваше время, чтобы пройти через этот код.
Код C ++ приведен ниже.
HRESULT hr = Nncam_PullStillImageV2(m_hcam, NULL, 24, &info);
if (SUCCEEDED(hr))
{
void* pRawData = malloc(info.width * info.height); // allocating memory based on width and Height of the image.
hr = Nncam_PullStillImage(m_hcam, pRawData, 24, NULL, NULL);
if (SUCCEEDED(hr))
{
unsigned nFourCC = 0, bitsperpixel = 0;
Nncam_get_RawFormat(m_hcam, &nFourCC, &bitsperpixel);
BITMAPINFOHEADER bmpHeader = { 0 };
bmpHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpHeader.biPlanes = 1;
bmpHeader.biBitCount = bitsperpixel;
bmpHeader.biWidth = info.width;
bmpHeader.biHeight = info.height;
if (bitsperpixel > 8)
{
bmpHeader.biSizeImage = info.width * info.height * 2;
}
else
{
bmpHeader.biSizeImage = info.width * info.height;
}
bmpHeader.biCompression = nFourCC;
// core logic for DNG conversion adding headers and rawimage data to Ptr
void* pDIB = malloc(sizeof(BITMAPINFOHEADER) + bmpHeader.biSizeImage);
memcpy_s(pDIB, sizeof(BITMAPINFOHEADER), &bmpHeader, sizeof(BITMAPINFOHEADER));
memcpy_s((char*)pDIB + sizeof(BITMAPINFOHEADER), bmpHeader.biSizeImage,
pRawData, bmpHeader.biSizeImage);
XIMAGEINFO imageInfo = { 0 };
imageInfo.iType = IMAGEFORMAT_DNG;
imageInfo.iCodec = 1;
BOOL res = ImageLib_Save(_T("image.dng"), pDIB, &imageInfo);
free(pDIB);
}
free(pRawData);
}
Код C #
if (cam_.PullStillImageV2(IntPtr.Zero, 24, out info)) /* peek the width and height */
{
uint pnWidth, pnHeight;
var sbmp = new Bitmap((int)info.width, (int)info.height, PixelFormat.Format24bppRgb);
var bmpdata = sbmp.LockBits(new Rectangle(0, 0, sbmp.Width, sbmp.Height), ImageLockMode.WriteOnly, sbmp.PixelFormat);
if (cam_.PullStillImage(bmpdata.Scan0, 24, out pnWidth, out pnHeight))
{
uint nFourCC = 0, bitsperpixel = 0;
cam_.get_RawFormat(out nFourCC, out bitsperpixel);
BITMAPINFOHEADER bmpHeader = new BITMAPINFOHEADER();
bmpHeader.Init();
bmpHeader.biPlanes = 1;
bmpHeader.biBitCount = bitsperpixel;
bmpHeader.biWidth = info.width;
bmpHeader.biHeight = info.height;
if (bitsperpixel > 8)
{
bmpHeader.biSizeImage = info.width * info.height * 2;
}
else
{
bmpHeader.biSizeImage = info.width * info.height;
}
bmpHeader.biCompression = nFourCC;
// adding header and rawdata to PDIB might not be correct way as shown in C++
IntPtr pDIB = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(BITMAPINFOHEADER)) + bmpHeader.biSizeImage));
Marshal.StructureToPtr(bmpHeader, pDIB, true);
CopyMemory(pDIB + Marshal.SizeOf(typeof(BITMAPINFOHEADER)), bmpdata.Scan0, bmpHeader.biSizeImage);
XIMAGEINFO imageInfo = new XIMAGEINFO();
imageInfo.iType = 17;
imageInfo.iCodec = 1;
ImageLib_Save("image.dng", pDIB, ref imageInfo);
}
}