ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ CLR Opencv Mat to Bitmap

2022-02-20 21:32:56  阅读:440  来源: 互联网

标签:newH img int bitmapData Bitmap Opencv newW CLR


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

 

标签:newH,img,int,bitmapData,Bitmap,Opencv,newW,CLR
来源: https://www.cnblogs.com/huzepan/p/15916621.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有