Ejemplo n.º 1
0
int DLL_CALLCONV
FIA_ReplaceColourPlanes (FIBITMAP **src, FIBITMAP *R, FIBITMAP *G, FIBITMAP *B)
{

	if (FreeImage_HasPixels(R) && FIA_Is8Bit(R)) {
		if (*src==NULL)
			*src = FreeImage_Allocate (FreeImage_GetWidth(R), FreeImage_GetHeight(R), 24);
		FIA_SetGreyLevelPalette (R);
		FreeImage_SetChannel(*src, R, FICC_RED);
	}
	
	if (FreeImage_HasPixels(G) && FIA_Is8Bit(G)) {
		if (*src==NULL)
			*src = FreeImage_Allocate (FreeImage_GetWidth(G), FreeImage_GetHeight(G), 24);
		FIA_SetGreyLevelPalette (G);
		FreeImage_SetChannel(*src, G, FICC_GREEN);
	}
	
	if (FreeImage_HasPixels(B) && FIA_Is8Bit(B)) {
		if (*src==NULL)
			*src = FreeImage_Allocate (FreeImage_GetWidth(B), FreeImage_GetHeight(B), 24);
		FIA_SetGreyLevelPalette (B);
		FreeImage_SetChannel(*src, B, FICC_BLUE);
	}
		
	return FIA_SUCCESS;
}
int DLL_CALLCONV
FIA_ReplaceColourPlanesHSV (FIBITMAP **src, FIBITMAP *H, FIBITMAP *S, FIBITMAP *V)
{
	// HSV source images must all be the same size
	FIBITMAP *R=NULL, *G=NULL, *B=NULL;
	int x, y;
	double h, s, v;

	// Check we have valid images
	if (!FreeImage_HasPixels(H) || !FIA_Is8Bit(H) ||
		!FreeImage_HasPixels(S) || !FIA_Is8Bit(S) ||
		!FreeImage_HasPixels(V) || !FIA_Is8Bit(V)) {
			return FIA_ERROR;
	}

	// alloc RGB to something the same size as the source images
	R = FreeImage_Clone(H);
	G = FreeImage_Clone(H);
	B = FreeImage_Clone(H);
 
	// Convert the HSV values to RGB and store
	for(y = 0; y < FreeImage_GetHeight(H); y++) {
		BYTE *src_h = FreeImage_GetScanLine(H, y);
		BYTE *src_s = FreeImage_GetScanLine(S, y);
		BYTE *src_v = FreeImage_GetScanLine(V, y);
		BYTE *dst_r = FreeImage_GetScanLine(R, y);
		BYTE *dst_g = FreeImage_GetScanLine(G, y);
		BYTE *dst_b = FreeImage_GetScanLine(B, y);
		
		for(x = 0; x < FreeImage_GetWidth(H); x++) {

			// Red, Green and Blue are between 0 and 255
			// Hue varies between 0 and 360
			// Satuation between 0 and 1
			// Value between 0 and 1

			h = ((double)(*src_h))/255.0 * 360.0;
			s = ((double)(*src_s))/255.0;
			v = ((double)(*src_v))/255.0;

			FIA_HSVToRGB (h, s, v, dst_r, dst_g, dst_b);

			// jump to next pixel
			src_h ++;
			src_s ++;
			src_v ++;
			dst_r ++;
			dst_g ++;
			dst_b ++;
		 }
	}

	FIA_ReplaceColourPlanes (src, R, G, B);

	FreeImage_Unload(R);
	FreeImage_Unload(G);
	FreeImage_Unload(B);

	return FIA_SUCCESS;
}