#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(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) : 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(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); } } 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(new VectorMemroy()); mem->buf().resize(size); // memcpy(mem->buf().data(), data, size); return mem; }