diff --git a/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp b/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp index 69db8f7..ba0d669 100644 --- a/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp +++ b/src/bindings/csharp/openalpr-net/bitmapmat-net.cpp @@ -5,23 +5,37 @@ using namespace openalprnet; BitmapMat::BitmapMat(array^ byteArray) { - this->m_bitmap = ByteArrayToMat(byteArray); + m_bitmap = new cv::Mat(); + std::vector buffer = AlprHelper::ToVector(byteArray); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); } BitmapMat::BitmapMat(Bitmap^ bitmap) { - this->m_bitmap = BitmapToMat(bitmap); + m_bitmap = new cv::Mat(); + + MemoryStream^ ms = gcnew MemoryStream(); + bitmap->Save(ms, ImageFormat::Png); + + std::vector buffer = AlprHelper::ToVector(ms->ToArray()); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); + + delete ms; } BitmapMat::BitmapMat(MemoryStream^ memoryStream) { - this->m_bitmap = MemoryStreamBitmapToMat(memoryStream); + m_bitmap = new cv::Mat(); + std::vector buffer = AlprHelper::ToVector(memoryStream->ToArray()); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); } BitmapMat::BitmapMat(String^ filename) { - Bitmap^ bitmap = gcnew Bitmap(filename); - this->m_bitmap = BitmapToMat(bitmap); - delete bitmap; + m_bitmap = new cv::Mat(); + array^ byteArray = File::ReadAllBytes(filename); + std::vector buffer = AlprHelper::ToVector(byteArray); + cv::imdecode(buffer, CV_LOAD_IMAGE_COLOR, this->m_bitmap); + delete byteArray; } diff --git a/src/bindings/csharp/openalpr-net/bitmapmat-net.h b/src/bindings/csharp/openalpr-net/bitmapmat-net.h index cedbf94..3732759 100644 --- a/src/bindings/csharp/openalpr-net/bitmapmat-net.h +++ b/src/bindings/csharp/openalpr-net/bitmapmat-net.h @@ -1,6 +1,9 @@ #pragma once -#include "opencv2/imgproc/imgproc.hpp" +#include +#include + +#include "helper-net.h" using namespace System; using namespace System::Drawing; @@ -33,74 +36,16 @@ namespace openalprnet { !BitmapMat() { - delete[] m_bitmap->data; + m_bitmap->release(); + delete m_bitmap; } property cv::Mat Value { cv::Mat get() { - cv::Mat value = this->m_bitmap->clone(); - return value; + return *m_bitmap; } } - private: - - static cv::Mat* BitmapToMat(Bitmap^ bitmap) - { - int channels = 0; - - switch (bitmap->PixelFormat) - { - case PixelFormat::Format8bppIndexed: - case PixelFormat::Format1bppIndexed: - channels = 1; - break; - case PixelFormat::Format24bppRgb: - channels = 3; - break; - case PixelFormat::Format32bppRgb: - case PixelFormat::Format32bppArgb: - case PixelFormat::Format32bppPArgb: - channels = 4; - break; - default: - throw gcnew NotSupportedException(bitmap->PixelFormat.ToString()); - } - - BitmapData^ bitmapData = bitmap->LockBits( - System::Drawing::Rectangle(0, 0, bitmap->Width, bitmap->Height), - ImageLockMode::ReadOnly, - bitmap->PixelFormat - ); - - const int totalBytes = bitmap->Height * bitmapData->Stride; - - char *dst = new char[totalBytes]; - ::memcpy(dst, bitmapData->Scan0.ToPointer(), totalBytes); - - cv::Mat* dstMat = new cv::Mat(cv::Size(bitmap->Width, bitmap->Height), CV_8UC(channels), dst); - - bitmap->UnlockBits(bitmapData); - - return dstMat; - } - - static cv::Mat* MemoryStreamBitmapToMat(MemoryStream^ memoryStream) - { - Bitmap^ bitmap = gcnew Bitmap(memoryStream); - cv::Mat* mat = BitmapToMat(bitmap); - delete bitmap; - return mat; - } - - static cv::Mat* ByteArrayToMat(array^ byteArray) - { - MemoryStream^ ms = gcnew MemoryStream(byteArray); - cv::Mat* mat = MemoryStreamBitmapToMat(ms); - delete ms; - return mat; - } - }; } \ No newline at end of file