&&: нельзя использовать это косвенное указание для типа PixelFormat - PullRequest
0 голосов
/ 20 марта 2020

Я разрабатываю приложение на C ++ / CLI, которое использует OpenCV 4.2. В следующем коде я пытаюсь преобразовать Bitmap в пользовательский тип (struct), но он выдает следующую ошибку:

ошибка C3699: '&&': невозможно использовать это косвенное type 'System :: Drawing :: Imaging :: PixelFormat'

Это мой код C ++:

typedef struct 
{
    cv::Mat mat;
    System::Drawing::Imaging::PixelFormat pixelFormat;
}CustomImage;


CustomImage BitmapToCustomImage(System::Drawing::Bitmap^ bitmap)
{
    CustomImage ob;
    ob.pixelFormat = bitmap->PixelFormat;

    System::Drawing::Rectangle blank = System::Drawing::Rectangle(0, 0, bitmap->Width, bitmap->Height);
    System::Drawing::Imaging::BitmapData^ bmpdata = bitmap->LockBits(blank, System::Drawing::Imaging::ImageLockMode::ReadWrite, bitmap->PixelFormat);

    int wb = ((bitmap->Width * 24 + 31) / 32) * 4;
    cv::Mat cv_img(cv::Size(bitmap->Width, bitmap->Height), CV_8UC3, bmpdata->Scan0.ToPointer(), wb);

    bitmap->UnlockBits(bmpdata);
    ob.mat = cv_img;
    return ob;
} // <------------- the error shows on this line when I compile

System::Drawing::Bitmap^ PerformSomeOperation(System::Drawing::Bitmap^ inputBitmap) 
{
    System::Drawing::Bitmap^ bitmap;
    CustomImage ob = BitmapToCustomImage(inputBitmap);
    // some stuff
    // try to convert back to bitmap
    return bitmap;
}

Вот как я передаю растровое изображение из C#:

Bitmap inputImage = (Bitmap)pictureBoxInput.Image;
inputImage = mylibname.PerformSomeOperation(inputImage);

Что я здесь не так делаю?

И есть ли другой способ передачи растрового изображения в приложение C ++ / CLI, кроме отправки дескриптора растрового изображения, поскольку это часто вызывает проблемы?

1 Ответ

1 голос
/ 20 марта 2020

Вы пытаетесь удерживать управляемый тип внутри собственной структуры. C ++ / CLI не допускает смешанные типы (это было предложено, но никогда не реализовывалось).

Попробуйте сохранить дескриптор отслеживания в штучной упаковке PixelFormat

struct 
{
    cv::Mat mat;
    gcroot<System::Drawing::Imaging::PixelFormat^> pixelFormat;
} CustomImage;

Это немного странно, поскольку PixelFormat является значением type и обычно не объединяется с ^, но строго ограниченный тип - это именно то, что вам нужно в этом конкретном сценарии.

(Вам также необходимо решить проблему времени жизни для буфера изображения, так как Дан указывает в своем комментарии )

...