tx-gxx-linux/device/gxx-linux/imgproc/imageencode.cpp

89 lines
2.5 KiB
C++

#include "imageencode.h"
#include "memoryex.h"
#include "opencv2/opencv.hpp"
#include "FreeImagePlus.h"
#include "StopWatch.h"
BmpImageEncode::~BmpImageEncode()
{
}
MemoryPtr BmpImageEncode::encode(cv::Mat &image)
{
fipImage fimage(FIT_BITMAP, image.cols, image.rows, image.type() == CV_8UC3 ? 24 : 8);
int byteWidth = image.elemSize() * image.cols;
for (int i = 0; i < fimage.getHeight(); i++)
memcpy(fimage.getScanLine(i), image.ptr<uchar>(i), byteWidth);
FipMemoryPtr mem(new FipMemory());
auto &mio = mem->io();
fimage.saveToMemory(FIF_PNG, mio);
return mem;
}
JpegImageEncode::JpegImageEncode(bool bwimg, int dpi)
{
if (!bwimg)
{
compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
compression_params.push_back(cv::IMWRITE_RESOLUTION_X);
compression_params.push_back(dpi);
compression_params.push_back(cv::IMWRITE_RESOLUTION_Y);
compression_params.push_back(dpi);
}
else{
compression_params.push_back(CV_IMWRITE_PNG_STRATEGY);
compression_params.push_back(cv::IMWRITE_PNG_STRATEGY_FIXED);
}
m_bwimg = bwimg;
}
JpegImageEncode::JpegImageEncode(const char* fmt, int dpi_h, int dpi_v, int jpeg_quality) : fmt_(fmt ? fmt : "")
{
if(fmt_ == "PNG")
{
compression_params.push_back(CV_IMWRITE_PNG_STRATEGY);
compression_params.push_back(cv::IMWRITE_PNG_STRATEGY_FIXED);
}
else
{
compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
compression_params.push_back(jpeg_quality);
compression_params.push_back(cv::IMWRITE_RESOLUTION_X);
compression_params.push_back(dpi_h);
compression_params.push_back(cv::IMWRITE_RESOLUTION_Y);
compression_params.push_back(dpi_v);
}
}
JpegImageEncode::~JpegImageEncode()
{
}
MemoryPtr JpegImageEncode::encode(cv::Mat &image)
{
VectorMemroyPtr mem = VectorMemroyPtr(new VectorMemroy());
StopWatch sw;
std::string type(m_bwimg ? ".png" : ".jpg");
if(fmt_ == "PNG")
type = ".png";
else if(fmt_ == "TIFF")
type = ".tiff";
else
type = ".jpg";
cv::imencode(type.c_str(), image, mem->buf(), compression_params);
printf("encode time = %0.2f \n", sw.elapsed_ms());
return mem;
}
MemoryPtr buff2mem(void *data, int size)
{
auto mem = std::shared_ptr<VectorMemroy>(new VectorMemroy());
mem->buf().resize(size);
// memcpy(mem->buf().data(), data, size);
return mem;
}