void ES::ImageProcessing::swapColorOper(cv::Mat* dst)
{
Mat src = imread("littleboy.png", IMREAD_COLOR);
cv::resize(src, src, Size(src.rows / 4 * 3, src.cols / 4 * 3));
unsigned int srcColor[3], dstColor[3];
ImageProcessingParams* img_params = static_cast<ImageProcessingParams*>(m_params);
unsigned int color = img_params->src_color;
srcColor[0] = (((color) >> 16) & 0xFF);
srcColor[1] = (((color) >> 8) & 0xFF);
srcColor[2] = (((color) >> 0) & 0xFF);
color = img_params->dst_color;
dstColor[0] = (((color) >> 16) & 0xFF);
dstColor[1] = (((color) >> 8) & 0xFF);
dstColor[2] = (((color) >> 0) & 0xFF);
Mat mat;
src.copyTo(mat);
swapColor(&mat, srcColor, dstColor);
Mat mergeMat(src.rows, src.cols + mat.cols, src.type());
Mat submat = mergeMat.colRange(0, src.cols);
src.copyTo(submat);
submat = mergeMat.colRange(src.cols, src.cols + mat.cols);
mat.copyTo(submat);
mergeMat.copyTo(*dst);
}
void ES::ImageProcessing::swapColor(cv::Mat* mat, unsigned int srcColor[3], unsigned int dstColor[3])
{
int rows = mat->rows;
int cols = mat->cols;
int type = mat->type();
int pos = 0;
uchar* ptr = mat->data;
size_t elemSize = mat->step[mat->dims - 1];
uchar color[3] = {0};
int b, g, r;
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
{
memcpy(color, ptr, elemSize);
b = (int)color[0];
g = (int)color[1];
r = (int)color[2];
if (r == srcColor[0] && g == srcColor[1] && b == srcColor[2])
{
color[0] = (char)dstColor[2];
color[1] = (char)dstColor[1];
color[2] = (char)dstColor[0];
memcpy(ptr, color, elemSize);
}
ptr += elemSize;
}
}
}