SOL9 2.0 Class: OpenCVBitmap

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree  SOL9 ClassList 

Source code

/******************************************************************************
 *
 * Copyright (c) 2017 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *  
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  OpenCVBitmap.h
 *
 *****************************************************************************/

#pragma once

#include <sol/View.h>
#include <sol/SmartPtrs.h>

#include <sol/opencv/OpenCVObject.h>

namespace SOL {
  
class OpenCVBitmap :public OpenCVObject {
protected:
  BITMAPINFO          bmpInfo;
  SmartPtrs<uint32_t> bmpData;
  
public:
  OpenCVBitmap()
  :OpenCVObject(),
  bmpData(NULL)
  {
    memset(&bmpInfo, 0, sizeof(bmpInfo));
  }

  ~OpenCVBitmap()
  {
  }
  
  virtual void reload()
  {
  }
  
  virtual void resize(float ratio)
  {
   // Define your own method in the subclass derived from this class
    
  }
  
  int getWidth()
  {
    return bmpInfo.bmiHeader.biWidth;
  }
  
  int getHeight()
  {
    return bmpInfo.bmiHeader.biHeight;
  }
  
  void set(BITMAPINFO info, uint32_t* data)
  {
    bmpInfo = info;
    //bmpData = NULL;
    bmpData = data;
  }

  virtual void update()
  {
    
  }
  
  virtual cv::Mat& getMat()
  {
    throw IException("No cv::Mat image data.");
  }
  
  virtual void convertToBitmap()
  {
  }
  
  //void draw(PaintDC &pdc, float dx, float dy, float dw, float dh,
  //                        float sx, float sy, float sw, float sh)
    
  void draw(DC& pdc, float dx, float dy, float dw, float dh,
                          float sx, float sy, float sw, float sh)
  {
    pdc.stretchDIBits( 
                    dx, dy, dw, dh, 
                    sx, sy, sw, sh, 
                    bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);
  }
  
 /* void draw(OpenCVGC* gc) 
  {
    if ( gc == nullptr || bmpData == nullptr ) {
      return;
    }
    
    HWND hwnd = gc->getWindow(); 

    RECT r;
    GetClientRect(hwnd, &r);
    //destination size.
    float dw = float(r.right  - r.left);
    float dh = float(r.bottom - r.top);
    
    //source size
    float sw = float(bmpInfo.bmiHeader.biWidth );
    float sh = float(bmpInfo.bmiHeader.biHeight);
      
    float tw = sw;  
    float th = sh;
    float dx = 0.0;
    float dy = 0.0;
        
    bool keepAspectRatio = gc->keepAspectRatio();
    bool fitWindowSize   = gc->fitWindowSize();
      gc->stretchDIBits( 
                    0.0, 0.0, sw, sh, 
                    0.0, 0.0, sw, sh, 
                    bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);
    return;    
    if ( !keepAspectRatio ) {
      gc->stretchDIBits( 
                    0.0, 0.0, dw, dh, 
                    0.0, 0.0, sw, sh, 
                    bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);
    } else {
      //sh should not be zero.
      //Keep the aspect ratio of the bitmap.
      if (dw >= sw && dh >= sh) {
        dx = (dw - tw)/2.0;
        dy = (dh - th)/2.0;
      } else if (dw <= sw && dh >= sh) {
        float rw = dw/sw;
        tw = sw * rw;
        th = sh * rw;
      } else if (dw <= sw && dh <= sh) {
        float rw = dw/sw;
        float rh = dh/sh;
        if (rw >= rh) {
          tw = sw * rw;
          th = sh * rw;
        } else {
          tw = sw * rh;
          th = sh * rh;
        }
      } else if (dw >= sw && dh <= sh) {
        float rh = dh / sh;
        tw = sw * rh;
        th = sh * rh;
      }
      dx = (dw - tw)/2.0;
      dy = (dh - th)/2.0;
      
      gc->stretchDIBits( 
                    dx, dy, tw, th, 
                    0.0, 0.0, sw, sh, 
                    bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);     
    }
   
  }
  */
};

}


Last modified: 5 May 2019

Copyright (c) 2009-2019 Antillia.com ALL RIGHTS RESERVED.