#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include"Commen.h"
#include"TRGB2HSV.h"
#include "TRGB2YUV.h"
#include "ImageProcessAPI.h"
int getPixel(unsigned char *srcData, int width, int height, int stride, int x, int y, int rgba[4])
{
x = x < 0 ? 0 : (x > width - 1 ? width - 1 : x);
y = y < 0 ? 0 : (y > height - 1 ? height - 1 : y);
int ret = 0;
if(srcData == NULL)
{
printf("input image is null!");
return -1;
}
// 图像处理,获取像素RGBA
int pos = x * 4 + y * stride;
rgba[0] = srcData[pos + 2];
rgba[1] = srcData[pos + 1];
rgba[2] = srcData[pos + 0];
rgba[3] = srcData[pos + 3];
return ret;
};
int adjustHSV(unsigned char *srcData, int width, int height, int stride, float hIntensity, float sIntensity, float vIntensity)
{
int ret = 0;
if (srcData == NULL)
{
printf("input image is null!");
return -1;
}
//Process
unsigned char R, G, B;
float h = 0, s = 0, v = 0;
unsigned char* pSrc = srcData;
int offset = stride - width * 4;
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
B = pSrc[0];
G = pSrc[1];
R = pSrc[2];
RGB2HSV(R, G, B, &h, &s, &v);
h = h + hIntensity > 360 ? h + hIntensity - 360 : h + hIntensity;
s = CLIP3(s + sIntensity, 0, 1.0f);
v = CLIP3(v + vIntensity, 0, 1.0f);
HSV2RGB(h, s, v, &R, &G, &B);
pSrc[0] = B;
pSrc[1] = G;
pSrc[2] = R;
pSrc += 4;
}
pSrc += offset;
}
return ret;
};
int extractYUV(unsigned char *srcData, int width, int height, int stride, int mode)
{
int ret = 0;
if (srcData == NULL)
{
printf("input image is null!");
return -1;
}
//Process
unsigned char R, G, B;
int y = 0, u = 0, v = 0;
unsigned char* pSrc = srcData;
int offset = stride - width * 4;
switch (mode)
{
case 0://display Y image
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
B = pSrc[0];
G = pSrc[1];
R = pSrc[2];
RGB2YUV(R, G, B, &y, &u, &v);
pSrc[0] = y;
pSrc[1] = y;
pSrc[2] = y;
pSrc += 4;
}
pSrc += offset;
}
break;
case 1://display U image
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
B = pSrc[0];
G = pSrc[1];
R = pSrc[2];
RGB2YUV(R, G, B, &y, &u, &v);
pSrc[0] = (u + 122) * 255 / 244;
pSrc[1] = (u + 122) * 255 / 244;
pSrc[2] = (u + 122) * 255 / 244;
pSrc += 4;
}
pSrc += offset;
}
break;
case 2://display V image
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
B = pSrc[0];
G = pSrc[1];
R = pSrc[2];
RGB2YUV(R, G, B, &y, &u, &v);
pSrc[0] = (u + 157) * 255 / 314;
pSrc[1] = (u + 157) * 255 / 314;
pSrc[2] = (u + 157) * 255 / 314;
pSrc += 4;
}
pSrc += offset;
}
break;
default:
break;
}
return ret;
};
int gray(unsigned char *srcData, int width, int height, int stride, int mode)
{
int ret = 0;
int i, j, gray, offset;
offset = stride - width * 4;
unsigned char* pSrc = srcData;
switch (mode)
{
case 0://mean gray method
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (pSrc[0] + pSrc[1] + pSrc[2]) / 3;
pSrc[0] = gray;
pSrc[1] = gray;
pSrc[2] = gray;
pSrc += 4;
}
pSrc += offset;
}
break;
case 1://classic gray method
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (299 * pSrc[2] + 587 * pSrc[1] + 114 * pSrc[0]) / 1000;
pSrc[0] = gray;
pSrc[1] = gray;
pSrc[2] = gray;
pSrc += 4;
}
pSrc += offset;
}
break;
case 2://photoshop gray method
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (MAX2(pSrc[0], MAX2(pSrc[1], pSrc[2])) + MIN2(pSrc[0], MIN2(pSrc[1], pSrc[2]))) / 2;
pSrc[0] = gray;
pSrc[1] = gray;
pSrc[2] = gray;
pSrc += 4;
}
pSrc += offset;
}
break;
default:
break;
}
return ret;
};
int threshold(unsigned char *srcData, int width, int height, int stride, int T)
{
int ret = 0;
int i, j, gray, offset;
offset = stride - width * 4;
unsigned char* pSrc = srcData;
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (pSrc[0] + pSrc[1] + pSrc[2]) / 3;
gray = gray < T ? 0 : 255;
pSrc[0] = gray;
pSrc[1] = gray;
pSrc[2] = gray;
pSrc += 4;
}
pSrc += offset;
}
return ret;
};
int histagram(unsigned char *srcData, int width, int height, int stride, int hist[256], int mode)
{
int ret = 0;
int i, j, gray, offset;
offset = stride - width * 4;
unsigned char* pSrc = srcData;
switch (mode)
{
case 0://Gray histagram
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
gray = (pSrc[0] + pSrc[1] + pSrc[2]) / 3;
hist[gray]++;
pSrc += 4;
}
pSrc += offset;
}
break;
case 1://Red histagram
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
hist[pSrc[2]]++;
pSrc += 4;
}
pSrc += offset;
}
break;
case 2://Green histagram
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
hist[pSrc[1]]++;
pSrc += 4;
}
pSrc += offset;
}
break;
case 3://Blue histagram
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
hist[pSrc[0]]++;
pSrc += 4;
}
pSrc += offset;
}
break;
default:
break;
}
return ret;
};
int brightContrast(unsigned char *srcData, int width, int height, int stride, int bright, int contrast)
{
int ret = 0;
bright = CLIP3(bright, -100, 100);
contrast = CLIP3(contrast, -100, 100);
//compute average light of image
int Average = 0;
int offset = stride - width * 4;
unsigned char* pSrc = srcData;
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
Average += (299 * pSrc[2] + 587 * pSrc[1] + 114 * pSrc[0]) / 1000;
pSrc += 4;
}
pSrc += offset;
}
Average = Average / (width * height);
pSrc = srcData;
unsigned char BC_MAP[256];
int temp = 0;
for (int i = 0; i < 256; i++)
{
int temp = contrast > 0 ? CLIP3(i + bright, 0, 255) : i;
if (contrast > 0)
{
temp = CLIP3(i + bright, 0, 255);
temp = CLIP3(Average + (temp - Average) * (1.0f / (1.0f - contrast / 100.0f)), 0, 255);
}
else
{
temp = i;
temp = CLIP3(Average + (temp - Average) * (1.0f + contrast / 100.0f), 0, 255);
temp = CLIP3(temp + bright, 0, 255);
}
BC_MAP[i] = temp;
}
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
pSrc[0] = BC_MAP[pSrc[0]];
pSrc[1] = BC_MAP[pSrc[1]];
pSrc[2] = BC_MAP[pSrc[2]];
pSrc += 4;
}
pSrc += offset;
}
return ret;
};