C++ CLR Opencv Mat to Bitmap

#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;
}

 

上一篇:AtCoder Beginner Contest 187 题解


下一篇:MS SQL SERVER操作API的GET和POST CLR