#pragma managed #ifndef _DEBUG #pragma comment(lib,"opencv_world455.lib") #else #pragma comment(lib,"opencv_world455d.lib") #endif using namespace System; using namespace System::Drawing; using namespace System::Drawing::Imaging; namespace OpencvCLRExtention { public ref class BitmapExtention { // TODO: 在此处为此类添加方法。 public: static Bitmap^ ResizeImage(BitmapData^ bitmapData, int newW, int newH); static Bitmap^ ResizeImageNew(BitmapData^ bitmapData, int newW, int newH); }; }
#include "pch.h" #include "OpencvCLRExtention.h" using namespace System::IO; using namespace System::Runtime::InteropServices; using namespace cv; Bitmap^ OpencvCLRExtention::BitmapExtention::ResizeImage(BitmapData^ bitmapData, int newW, int newH) { // TODO: 在此处插入 return 语句 Mat source = Mat(bitmapData->Height, bitmapData->Width, CV_8UC3, bitmapData->Scan0.ToPointer(), bitmapData->Stride); cv::Size size = cv::Size(newW, newH); Mat img; cv::resize(source, img, size); Bitmap^ bmp = gcnew Bitmap(newW, newH,img.step, PixelFormat::Format24bppRgb, (IntPtr)img.data); array< Byte >^ imageData; Bitmap^ output; // Create the byte array. { MemoryStream^ ms = gcnew MemoryStream(); bmp->Save(ms, ImageFormat::Jpeg); imageData = ms->ToArray(); delete ms; } // Convert back to bitmap { MemoryStream^ ms = gcnew MemoryStream(imageData); output = (Bitmap^)Bitmap::FromStream(ms); } delete bmp; return output; } Bitmap^ OpencvCLRExtention::BitmapExtention::ResizeImageNew(BitmapData^ bitmapData, int newW, int newH) { // TODO: 在此处插入 return 语句 Mat source = Mat(bitmapData->Height, bitmapData->Width, CV_8UC3, bitmapData->Scan0.ToPointer(), bitmapData->Stride); cv::Size size = cv::Size(newW, newH); Mat img; cv::resize(source, img, size); Bitmap^ resultimage = nullptr; resultimage = gcnew Bitmap(newW, newH, PixelFormat::Format24bppRgb); BitmapData^ resultimageData = resultimage->LockBits(Rectangle(0, 0, newW, newH), ImageLockMode::ReadWrite, resultimage->PixelFormat); int actualWidth = newW * 3; int offset = resultimageData->Stride - actualWidth; uchar* outputData_b = (uchar*)(void*)resultimageData->Scan0; uchar* imgdata = img.data; int posreal = 0, posscan = 0; for (int r = 0; r < newH; r++) { for (int c = 0; c < actualWidth; c++) { outputData_b[posscan++] = imgdata[posreal++]; } posscan += offset; } resultimage->UnlockBits(resultimageData); return resultimage; }