91 lines
2.5 KiB
C++
91 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 if(fmt_ == "BMP")
|
|
type = ".bmp";
|
|
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;
|
|
} |